mapiutil.pas

来自「Drag files and Drop to delphi forms 0402」· PAS 代码 · 共 294 行

PAS
294
字号
{

THIS FILE MUST BE THE LAST AMONG THE MAPI HEADERS IN THE "USES" CLAUSE
IF YOU WANT TO DYNAMICALLY LINK TO THE MAPI32.DLL !!!!

}

unit MAPIUtil;

interface

uses MAPIDefs,Windows,ActiveX,MAPIX, MAPIGUID, IMessage, TNEF;

const
  Mapi32Dll = 'mapi32.dll';

  // RTF Sync Utilities
  RTF_SYNC_RTF_CHANGED  = $00000001;
  RTF_SYNC_BODY_CHANGED = $00000002;

type

  ITableData = interface;

  TCallerRelease = procedure(ulCallerData : ULONG; lpTblData : ITableData; lpVue : IMAPITable);stdcall;

  ITableData = interface(IUnknown)
    [strIID_IMAPITableData]
    function HrGetView(lpSSortOrderSet : PSSortOrderSet; lpfCallerRelease : TCallerRelease;
                       uCallerData : ULONG; var lppMAPITable : IMAPITable):HResult;stdcall;
    function HrModifyRow(lpSRow : PSRow):HResult;stdcall;
    function HrDeleteRow(lpSPropValue : PSPropValue):HResult;stdcall;
    function HrQueryRow(lpSPropValue : PSPropValue; var lppSRow : PSRow; var lpuliRow : ULONG):HResult;stdcall;
    function HrEnumRow(ulRowNumber : ULONG; var lppSRow : PSRow):HResult;stdcall;
    function HrNotify(ulFlags : ULONG; cValues : ULONG; lpSPropValue : PSPropValue):HResult;stdcall;
    function HrInsertRow(uliRow : ULONG; lpSRow : PSRow):HResult;stdcall;
    function HrModifyRows(ulFlags : ULONG; lpSRowSet : PSRowSet):HResult;stdcall;
    function HrDeleteRows(ulFlags : ULONG; lprowsetToDelete : PSRowSet; var cRowsDeleted : ULONG):HResult;stdcall;
  end;

  PDTCTL = ^TDTCTL;
  TDTCTL = record
    ulCtlType : ULONG;
    ulCtlFlags : ULONG;
    lpbNotif : PBYTE;
    cbNotif : ULONG;
    lpszFilter : LPTSTR;
    ulItemID : ULONG;
    case integer of
      0 : ( lpv : pointer );
      1 : ( lplabel : PDTBLLABEL);
      2 : ( lpedit : PDTBLEDIT);
      3 : ( lplbx : PDTBLLBX);
      4 : ( lpcombobox : PDTBLCOMBOBOX);
      5 : ( lpddlbx : PDTBLDDLBX);
      6 : ( lpcheckbox : PDTBLCHECKBOX);
      7 : ( lpgroupbox : PDTBLGROUPBOX);
      8 : ( lpbutton : PDTBLBUTTON);
      9 : ( lpradiobutton : PDTBLRADIOBUTTON);
      10: ( lpmvlbx : PDTBLMVLISTBOX);
      11: ( lpmvddlbx : PDTBLMVDDLBX);
      12: ( lppage : PDTBLPAGE);
  end;

  PDTPage = ^TDTPage;
  TDTPage = record
    cctl : ULONG;
    lpszResourceName : LPTSTR;
    case integer of
      0 : (
        lpszComponent : LPTSTR;
          );
      1 : (
        ulItemID : ULONG;
        lpctl : PDTCTL;
          );
  end;

//*****************************************************
//        MAPIUtil function
//*****************************************************

TBuildDisplayTable = function(lpAllocateBuffer : PALLOCATEBUFFER;
                              lpAllocateMore : PALLOCATEMORE;
                              lpFreeBuffer : PFREEBUFFER;
                              lpMalloc : IMalloc;
                              HInstance : Longint;
                              cPages : UINT;
                              lpPage : PDTPage;
                              ulFlags : ULONG;
                              var lppTable : IMAPITable;
                              var lppTblData : ITableData):HResult;stdcall;

TCreateTable = function (const lpInterface: TGUID; lpAllocateBuffer : PALLOCATEBUFFER;
                         lpAllocateMore : PALLOCATEMORE; lpFreeBuffer : PFREEBUFFER;
                         lpvReserved : pointer; ulTableType : ULONG;
                         ulPropTagIndexColumn : ULONG;
                         lpSPropTagArrayColumns : PSPropTagArray;
                         var lppTableData : ITableData):HResult;stdcall;

THrQueryAllRows = function (ptable : IMAPITABLE;
                        ptaga:PSPropTagArray;
                        pres:PSRestriction;
                        psos:PSSortOrderSet;
                        crowsMax:longint;
                        var pprows:PSRowSet):HResult;stdcall;

TOpenStreamOnFile = function (lpAllocateBuffer:PALLOCATEBUFFER;
                          lpFreeBuffer:PFREEBUFFER;
                          ulFlags:ULONG;
                          lpszFileName:PChar;
                          lpszPrefix:PChar;
                          var Stream:IStream):HRESULT;stdcall;

TFreeProws = function (prows : PSRowSet):HResult; stdcall;

TFreePAdrList = function (prows : PAdrList):HResult; stdcall;

THrSzFromEntryID = function (cb : ULONG; pentry : PEntryID; var psz: PChar):HResult; stdcall;

THrGetOneProp = function (pmp : IMAPIPROP; ulPropTag:ULONG; var ppprop : PSPropValue):HResult; stdcall;

THrSetOneProp = function (pmp : IMAPIPROP; pprop : PSPropValue):HResult; stdcall;

TWrapCompressedRTFStream = function (lpCompressedRTFStream : IStream; ulflags : ULONG; var lpUncompressedRTFStream : IStream): HResult; stdcall;
TRTFSync = function(lpMessage : MAPIDefs.IMessage; ulFlags : ULONG; var lpfMessageUpdated : BOOL):HResult; stdcall;

THrEntryIDFromSz = function (sz : PChar; var pcb: ULONG; var ppentry : PENTRYID):HResult; stdcall;

TOpenTnefStreamEx = function (lpvSupport : pointer; lpStreamName : IStream;
                              lpszStreamName : PChar; ulFlags : ULONG; lpMessage : MAPIDefs.IMessage;
                              wKeyVal : ULONG {?}; lpAdressBook : IADDRBOOK; var lppTNEF : ITNEF) :HResult; stdcall;

TMAPIInitIdle = function(lpvReserved : pointer):HResult; stdcall;
TMAPIDeinitIdle = procedure;stdcall;
TFtgRegisterIdleRoutine = function (lpfnIdle : pointer; lpvIdleParam : pointer;
            priIdle : integer; csecIdle : ULONG; iroIdle : ULONG):HResult; stdcall;
TDeregisterIdleRoutine  = procedure(ftg : ULONG);stdcall;


//*****************************************************
//        IMessage function
//*****************************************************

TOpenIMsgSession = function  (
  lpMalloc : IMalloc;                          { -> Co malloc object          }
  ulFlags : ULONG;                             { reserved. Must be zero.      }
  var lppMsgSess : PMSGSESS) : SCODE; stdcall; { <- message session object    }

TCloseIMsgSession = procedure  (
  lpMsgSess : PMSGSESS); stdcall;              { -> message session object    }

TOpenIMsgOnIStg = function  (
  lpMsgSess : PMSGSESS;                { -> message session obj (optional) }
  lpAllocateBuffer : PALLOCATEBUFFER;  { -> AllocateBuffer memory routine  }
  lpAllocateMore : PALLOCATEMORE;      { -> AllocateMore memory routine    }
  lpFreeBuffer : PFREEBUFFER;          { -> FreeBuffer memory routine      }
  lpMalloc : IMalloc;                  { -> Co malloc object               }
  lpMapiSup : Pointer;                 { -> MAPI Support Obj (optional)    }
  lpStg : IStorage;                    { -> open IStorage containing msg   }
  var lpfMsgCallRelease : TMSGCALLRELEASE;{ -> release callback rtn (opt) }
  ulCallerData : ULONG;                { caller data returned in callback  }
  ulFlags : ULONG;                     { -> flags (controls istg commit)   }
  out lppMsg : MapiDefs.IMessage) : SCODE; stdcall;

TGetAttribIMsgOnIStg = function  (lpObject : Pointer;
  lpPropTagArray : PSPropTagArray;
  var lppPropAttrArray : PSPropAttrArray) : HResult; stdcall;

TSetAttribIMsgOnIStg = function  (lpObject : Pointer;
  lpPropTags : PSPropTagArray; lpPropAttrs : PSPropAttrArray;
  var lppPropProblems : PSPropProblemArray) : HResult; stdcall;

TMapStorageSCode = function  (StgSCode : SCODE) : SCODE; stdcall;

//*****************************************************
//        MAPIX function
//*****************************************************

TMAPIInitialize = function  (lpMapiInit : Pointer) : HResult; stdcall;

TMAPIUninitialize = procedure ; stdcall;

TMAPILogonEx = function  (ulUIParam : ULONG; lpszProfileName : PChar;
  lpszPassword : PChar; ulFlags : ULONG; {  ulFlags takes all that SimpleMAPI does + MAPI_UNICODE }
  out lppSession : IMAPISession) : HResult; stdcall;

TMAPIAllocateBuffer = function  (cbSize : ULONG;
  var lppBuffer : Pointer) : SCODE; stdcall;

TMAPIAllocateMore = function  (cbSize : ULONG; lpObject : Pointer;
  var lppBuffer : Pointer) : SCODE; stdcall;

TMAPIFreeBuffer = function  (lpBuffer : Pointer) : ULONG; stdcall;

TMAPIAdminProfiles = function  (ulFlags : ULONG;
  out lppProfAdmin : IProfAdmin) : HResult; stdcall;

TMAPIGetDefaultMalloc = function:pointer;stdcall;



var HrQueryAllRows:THrQueryAllRows = nil;
    OpenStreamOnFile:TOpenStreamOnFile = nil;
    FreeProws:TFreeProws = nil;
    FreePAdrList:TFreePAdrList = nil;
    HrSzFromEntryID:THrSzFromEntryID = nil;
    HrEntryIDFromSz:THrEntryIDFromSz = nil;
    HrGetOneProp:THrGetOneProp = nil;
    HrSetOneProp:THrSetOneProp = nil;
    WrapCompressedRTFStream:TWrapCompressedRTFStream = nil;
    RTFSync:TRTFSync = nil;
    CreateTable : TCreateTable = nil;
    BuildDisplayTable : TBuildDisplayTable = nil;

    OpenIMsgSession:TOpenIMsgSession = nil;
    CloseIMsgSession:TCloseIMsgSession= nil;
    OpenIMsgOnIStg:TOpenIMsgOnIStg= nil;
    GetAttribIMsgOnIStg:TGetAttribIMsgOnIStg= nil;
    SetAttribIMsgOnIStg:TSetAttribIMsgOnIStg= nil;
    MapStorageSCode:TMapStorageSCode= nil;

    MAPIInitialize:TMAPIInitialize = nil;
    MAPIUninitialize:TMAPIUninitialize = nil;
    MAPILogonEx:TMAPILogonEx = nil;
    MAPIAllocateBuffer:TMAPIAllocateBuffer = nil;
    MAPIAllocateMore:TMAPIAllocateMore = nil;
    MAPIFreeBuffer:TMAPIFreeBuffer = nil;
    MAPIAdminProfiles:TMAPIAdminProfiles = nil;
    MAPIGetDefaultMalloc:TMAPIGetDefaultMalloc = nil;
    OpenTnefStreamEx:TOpenTnefStreamEx = nil;

    MAPIInitIdle : TMAPIInitIdle= nil;
    MAPIDeinitIdle : TMAPIDeinitIdle = nil;
    FtgRegisterIdleRoutine :TFtgRegisterIdleRoutine = nil;
    DeregisterIdleRoutine : TDeregisterIdleRoutine = nil;

const
     IRONULL          = $0000;
     FIROWAIT         = $0001;
     FIROINTERVAL     = $0002;
     FIROPERBLOCK     = $0004;
     FIRODISABLED     = $0020;
     FIROONCEONLY     = $0040;


var MAPIDLLHandle:THandle;

implementation

initialization
  MAPIDLLHandle:=LoadLibrary('MAPI32.DLL');
  if MAPIDLLHandle <> 0 then begin

    HrQueryAllRows:=GetProcAddress(MAPIDLLHandle,'HrQueryAllRows@24');
    OpenStreamOnFile:=GetProcAddress(MAPIDLLHandle,'OpenStreamOnFile@24');
    FreeProws:=GetProcAddress(MAPIDLLHandle,'FreeProws@4');
    FreePAdrList:=GetProcAddress(MAPIDLLHandle,'FreePadrlist@4');
    HrSzFromEntryID:=GetProcAddress(MAPIDLLHandle,'HrSzFromEntryID@12');
    HrEntryIDFromSz:=GetProcAddress(MAPIDLLHandle,'HrEntryIDFromSz@12');
    HrSzFromEntryID:=GetProcAddress(MAPIDLLHandle,'HrSzFromEntryID@12');
    HrGetOneProp:=GetProcAddress(MAPIDLLHandle,'HrGetOneProp@12');
    HrSetOneProp:=GetProcAddress(MAPIDLLHandle,'HrSetOneProp@8');
    WrapCompressedRTFStream:=GetProcAddress(MAPIDLLHandle,'WrapCompressedRTFStream');
    RTFSync:=GetProcAddress(MAPIDLLHandle,'RTFSync');
    CreateTable:=GetProcAddress(MAPIDLLHandle,'CreateTable@36');
    BuildDisplayTable:=GetProcAddress(MAPIDLLHandle,'BuildDisplayTable@40');

    OpenIMsgSession:=GetProcAddress(MAPIDLLHandle,'OpenIMsgSession@12');
    CloseIMsgSession:=GetProcAddress(MAPIDLLHandle,'CloseIMsgSession@4');
    OpenIMsgOnIStg:=GetProcAddress(MAPIDLLHandle,'OpenIMsgOnIStg@44');
    GetAttribIMsgOnIStg:=GetProcAddress(MAPIDLLHandle,'GetAttribIMsgOnIStg@12');
    SetAttribIMsgOnIStg:=GetProcAddress(MAPIDLLHandle,'SetAttribIMsgOnIStg@16');
    MapStorageSCode:=GetProcAddress(MAPIDLLHandle,'MapStorageSCode@4');

    MAPIInitialize:=GetProcAddress(MAPIDLLHandle,'MAPIInitialize');
    MAPIUninitialize:=GetProcAddress(MAPIDLLHandle,'MAPIUninitialize');
    MAPILogonEx:=GetProcAddress(MAPIDLLHandle,'MAPILogonEx');
    MAPIAllocateBuffer:=GetProcAddress(MAPIDLLHandle,'MAPIAllocateBuffer');
    MAPIAllocateMore:=GetProcAddress(MAPIDLLHandle,'MAPIAllocateMore');
    MAPIFreeBuffer:=GetProcAddress(MAPIDLLHandle,'MAPIFreeBuffer');
    MAPIAdminProfiles:=GetProcAddress(MAPIDLLHandle,'MAPIAdminProfiles');
    MAPIGetDefaultMalloc:=GetProcAddress(MAPIDLLHandle,'MAPIGetDefaultMalloc@0');
    OpenTnefStreamEx:=GetProcAddress(MAPIDLLHandle,'OpenTnefStreamEx');
    MAPIInitIdle:=GetProcAddress(MAPIDLLHandle,'MAPIInitIdle@4');
    MAPIDeinitIdle:=GetProcAddress(MAPIDLLHandle,'MAPIDeinitIdle@0');
    FtgRegisterIdleRoutine:=GetProcAddress(MAPIDLLHandle,'FtgRegisterIdleRoutine@20');
    DeregisterIdleRoutine:=GetProcAddress(MAPIDLLHandle,'DeregisterIdleRoutine@4');

  end;
finalization
  if MAPIDLLHandle <> INVALID_HANDLE_VALUE then FreeLibrary(MAPIDLLHandle)
end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?