home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1997 May / Pcwk0597.iso / borland / cb / setup / cbuilder / data.z / MAPI.PAS < prev    next >
Pascal/Delphi Source File  |  1997-02-28  |  19KB  |  497 lines

  1.  
  2. {*******************************************************}
  3. {                                                       }
  4. {       Delphi Runtime Library                          }
  5. {       Simple MAPI Interface Unit                      }
  6. {                                                       }
  7. {       Copyright (c) 1996 Borland International        }
  8. {                                                       }
  9. {*******************************************************}
  10.  
  11. unit Mapi;
  12.  
  13. interface
  14.  
  15. uses Windows;
  16.  
  17. {
  18.   Messaging Applications Programming Interface.
  19.  
  20.   Purpose:
  21.  
  22.     This file defines the structures and constants used by that
  23.     subset of the Messaging Applications Programming Interface
  24.     which is supported under Windows by Microsoft Mail for PC
  25.     Networks version 3.x.
  26. }
  27.  
  28. type
  29.   FLAGS = Cardinal;
  30.   {$nonamespace FLAGS}
  31.   LHANDLE = Cardinal;
  32.   {$nonamespace LHANDLE}
  33.   PLHANDLE = ^Cardinal;
  34.  
  35. const
  36.   lhSessionNull = (0);
  37.  
  38. type
  39.   PMapiFileDesc = ^TMapiFileDesc;
  40.   MapiFileDesc = packed record
  41.     ulReserved: Cardinal;        { Reserved for future use (must be 0)     }
  42.     flFlags: Cardinal;           { Flags                                   }
  43.     nPosition: Cardinal;         { character in text to be replaced by attachment }
  44.     lpszPathName: LPSTR;         { Full path name of attachment file       }
  45.     lpszFileName: LPSTR;         { Original file name (optional)           }
  46.     lpFileType: Pointer;         { Attachment file type (can be lpMapiFileTagExt) }
  47.   end;
  48.   {$nonamespace MapiFileDesc}
  49.   TMapiFileDesc = MapiFileDesc;
  50.  
  51. const
  52.   MAPI_OLE = $00000001; 
  53.   MAPI_OLE_STATIC = $00000002; 
  54.  
  55. type
  56.   PMapiFileTagExt = ^TMapiFileTagExt;
  57.   MapiFileTagExt = packed record 
  58.     ulReserved: Cardinal;       { Reserved, must be zero.                  }
  59.     cbTag: Cardinal;            { Size (in bytes) of                       }
  60.     lpTag: PByte;               { X.400 OID for this attachment type       }
  61.     cbEncoding: Cardinal;       { Size (in bytes) of                       }
  62.     lpEncoding: PByte;          { X.400 OID for this attachment's encoding }
  63.   end;
  64.   {$nonamespace MapiFileTagExt}
  65.   TMapiFileTagExt = MapiFileTagExt;
  66.  
  67.   PMapiRecipDesc = ^TMapiRecipDesc;
  68.   MapiRecipDesc = packed record 
  69.     ulReserved: Cardinal;       { Reserved for future use                  }
  70.     ulRecipClass: Cardinal;     { Recipient class                          }
  71.                                 { MAPI_TO, MAPI_CC, MAPI_BCC, MAPI_ORIG    }
  72.     lpszName: LPSTR;            { Recipient name                           }
  73.     lpszAddress: LPSTR;         { Recipient address (optional)             }
  74.     ulEIDSize: Cardinal;        { Count in bytes of size of pEntryID       }
  75.     lpEntryID: Pointer;         { System-specific recipient reference      }
  76.   end;
  77.   {$nonamespace MapiRecipDesc}
  78.   TMapiRecipDesc = MapiRecipDesc;
  79.  
  80. const
  81.   MAPI_ORIG = 0;                { Recipient is message originator          }
  82.   MAPI_TO = 1;                  { Recipient is a primary recipient         }
  83.   MAPI_CC = 2;                  { Recipient is a copy recipient            }
  84.   MAPI_BCC = 3;                 { Recipient is blind copy recipient        }
  85.  
  86. type
  87.   PMapiMessage = ^TMapiMessage;
  88.   MapiMessage = packed record
  89.     ulReserved: Cardinal;         { Reserved for future use (M.B. 0)       }
  90.     lpszSubject: LPSTR;           { Message Subject                        }
  91.     lpszNoteText: LPSTR;          { Message Text                           }
  92.     lpszMessageType: LPSTR;       { Message Class                          }
  93.     lpszDateReceived: LPSTR;      { in YYYY/MM/DD HH:MM format             }
  94.     lpszConversationID: LPSTR;    { conversation thread ID                 }
  95.     flFlags: FLAGS;               { unread,return receipt                  }
  96.     lpOriginator: PMapiRecipDesc; { Originator descriptor                  }
  97.     nRecipCount: Cardinal;        { Number of recipients                   }
  98.     lpRecips: PMapiRecipDesc;     { Recipient descriptors                  }
  99.     nFileCount: Cardinal;         { # of file attachments                  }
  100.     lpFiles: PMapiFileDesc;       { Attachment descriptors                 }
  101.   end;
  102.   {$nonamespace MapiMessage}
  103.   TMapiMessage = MapiMessage;
  104.  
  105. const
  106.   MAPI_UNREAD = $00000001; 
  107.   MAPI_RECEIPT_REQUESTED = $00000002; 
  108.   MAPI_SENT = $00000004; 
  109.  
  110. { Entry points. }
  111.  
  112. { flFlags values for Simple MAPI entry points. All documented flags are
  113.   shown for each call. Duplicates are commented out but remain present
  114.   for every call. }
  115.  
  116. { MAPILogon() flags. }
  117.  
  118.   MAPI_LOGON_UI = $00000001;                { Display logon UI             }
  119.   MAPI_PASSWORD_UI = $00020000;             { prompt for password only     }
  120.   MAPI_NEW_SESSION = $00000002;             { Don't use shared session     }
  121.   MAPI_FORCE_DOWNLOAD = $00001000;          { Get new mail before return   }
  122.   MAPI_ALLOW_OTHERS = $00000008;            { Make this a shared session   }
  123.   MAPI_EXPLICIT_PROFILE = $00000010;        { Don't use default profile    }
  124.   MAPI_EXTENDED = $00000020;                { Extended MAPI Logon          }
  125.   MAPI_USE_DEFAULT = $00000040;             { Use default profile in logon }
  126.  
  127.   MAPI_SIMPLE_DEFAULT = MAPI_LOGON_UI or MAPI_FORCE_DOWNLOAD or MAPI_ALLOW_OTHERS; 
  128.   MAPI_SIMPLE_EXPLICIT = MAPI_NEW_SESSION or MAPI_FORCE_DOWNLOAD or MAPI_EXPLICIT_PROFILE; 
  129.  
  130. { MAPILogoff() flags.      }
  131.  
  132.   MAPI_LOGOFF_SHARED = $00000001;           { Close all shared sessions    }
  133.   MAPI_LOGOFF_UI = $00000002;               { It's OK to present UI        }
  134.  
  135. { MAPISendMail() flags.    }
  136.  
  137. { #define MAPI_LOGON_UI        0x00000001     Display logon UI             }
  138. { #define MAPI_NEW_SESSION     0x00000002     Don't use shared session     }
  139.   MAPI_DIALOG = $00000008;                  { Display a send note UI       }
  140. { # define MAPI_USE_DEFAULT     0x00000040     Use default profile in logon }
  141.  
  142. { MAPIFindNext() flags.    }
  143.  
  144.   MAPI_UNREAD_ONLY = $00000020;             { Only unread messages         }
  145.   MAPI_GUARANTEE_FIFO = $00000100;          { use date order               }
  146.   MAPI_LONG_MSGID = $00004000;              { allow 512 char returned ID   }
  147.  
  148. { MAPIReadMail() flags.    }
  149.  
  150.   MAPI_PEEK = $00000080;                    { Do not mark as read.         }
  151.   MAPI_SUPPRESS_ATTACH = $00000800;         { header + body, no files      }
  152.   MAPI_ENVELOPE_ONLY = $00000040;           { Only header information      }
  153.   MAPI_BODY_AS_FILE = $00000200; 
  154.  
  155. { MAPISaveMail() flags.    }
  156.  
  157. { #define MAPI_LOGON_UI        0x00000001     Display logon UI             }
  158. { #define MAPI_NEW_SESSION     0x00000002     Don't use shared session     }
  159. { #define MAPI_LONG_MSGID      0x00004000  /* allow 512 char returned ID   }
  160.  
  161. { MAPIAddress() flags.     }
  162.  
  163. { #define MAPI_LOGON_UI        0x00000001     Display logon UI             }
  164. { #define MAPI_NEW_SESSION     0x00000002     Don't use shared session     }
  165.  
  166. { MAPIDetails() flags.     }
  167.  
  168. { #define MAPI_LOGON_UI        0x00000001     Display logon UI             }
  169. { #define MAPI_NEW_SESSION     0x00000002     Don't use shared session     }
  170.   MAPI_AB_NOMODIFY = $00000400;             { Don't allow mods of AB entries }
  171.  
  172. { MAPIResolveName() flags. }
  173.  
  174. { #define MAPI_LOGON_UI        0x00000001     Display logon UI             }
  175. { #define MAPI_NEW_SESSION     0x00000002     Don't use shared session     }
  176. { #define MAPI_DIALOG          0x00000008     Prompt for choices if ambiguous }
  177. { #define MAPI_AB_NOMODIFY     0x00000400     Don't allow mods of AB entries }
  178.  
  179. type
  180.   PFNMapiLogon = ^TFNMapiLogOn;
  181.   TFNMapiLogOn = function(ulUIParam: Cardinal; lpszProfileName: LPSTR; 
  182.     lpszPassword: LPSTR; flFlags: FLAGS; ulReserved: Cardinal; 
  183.     lplhSession: PLHANDLE): Cardinal stdcall;
  184.  
  185.   PFNMapiLogOff = ^TFNMapiLogOff;
  186.   TFNMapiLogOff = function(lhSession: LHANDLE; ulUIParam: Cardinal; flFlags: FLAGS;
  187.     ulReserved: Cardinal): Cardinal stdcall;
  188.  
  189.   PFNMapiSendMail = ^TFNMapiSendMail;
  190.   TFNMapiSendMail = function(lhSession: LHANDLE; ulUIParam: Cardinal;
  191.     var lpMessage: TMapiMessage; flFlags: FLAGS;
  192.     ulReserved: Cardinal): Cardinal stdcall;
  193.  
  194.   PFNMapiSendDocuments = ^TFNMapiSendDocuments;
  195.   TFNMapiSendDocuments = function(ulUIParam: Cardinal; lpszDelimChar: LPSTR;
  196.     lpszFilePaths: LPSTR; lpszFileNames: LPSTR;
  197.     ulReserved: Cardinal): Cardinal stdcall;
  198.  
  199.   PFNMapiFindNext = ^TFNMapiFindNext;
  200.   TFNMapiFindNext = function(lhSession: LHANDLE; ulUIParam: Cardinal;
  201.     lpszMessageType: LPSTR; lpszSeedMessageID: LPSTR; flFlags: FLAGS;
  202.     ulReserved: Cardinal; lpszMessageID: LPSTR): Cardinal stdcall;
  203.  
  204.   PFNMapiReadMail = ^TFNMapiReadMail;
  205.   TFNMapiReadMail = function(lhSession: LHANDLE; ulUIParam: Cardinal;
  206.     lpszMessageID: LPSTR; flFlags: FLAGS; ulReserved: Cardinal;
  207.     var lppMessage: PMapiMessage): Cardinal stdcall;
  208.  
  209.   PFNMapiSaveMail = ^TFNMapiSaveMail;
  210.   TFNMapiSaveMail = function(lhSession: LHANDLE; ulUIParam: Cardinal; 
  211.     var lpMessage: TMapiMessage; flFlags: FLAGS; ulReserved: Cardinal; 
  212.     lpszMessageID: LPSTR): Cardinal stdcall;
  213.  
  214.   PFNMapiDeleteMail = ^TFNMapiDeleteMail;
  215.   TFNMapiDeleteMail = function(lhSession: LHANDLE; ulUIParam: Cardinal; 
  216.     lpszMessageID: LPSTR; flFlags: FLAGS; 
  217.     ulReserved: Cardinal): Cardinal stdcall;
  218.  
  219.   PFNMapiFreeBuffer = ^TFNMapiFreeBuffer;
  220.   TFNMapiFreeBuffer = function(pv: Pointer): Cardinal stdcall;
  221.  
  222.   PFNMapiAddress = ^TFNMapiAddress;
  223.   TFNMapiAddress = function(lhSession: LHANDLE; ulUIParam: Cardinal; 
  224.     lpszCaption: LPSTR; nEditFields: Cardinal; lpszLabels: LPSTR; 
  225.     nRecips: Cardinal; var lpRecips: TMapiRecipDesc; flFlags: FLAGS; 
  226.     ulReserved: Cardinal; lpnNewRecips: PULONG; 
  227.     var lppNewRecips: PMapiRecipDesc): Cardinal stdcall;
  228.  
  229.   PFNMapiDetails = ^TFNMapiDetails;
  230.   TFNMapiDetails = function(lhSession: LHANDLE; ulUIParam: Cardinal; 
  231.     var lpRecip: TMapiRecipDesc; flFlags: FLAGS; 
  232.     ulReserved: Cardinal): Cardinal stdcall;
  233.  
  234.   PFNMapiResolveName = ^TFNMapiResolveName;
  235.   TFNMapiResolveName = function(lhSession: LHANDLE; ulUIParam: Cardinal; 
  236.     lpszName: LPSTR; flFlags: FLAGS; ulReserved: Cardinal; 
  237.     var lppRecip: PMapiRecipDesc): Cardinal stdcall;
  238.  
  239. const
  240.   SUCCESS_SUCCESS = 0; 
  241.   MAPI_USER_ABORT = 1; 
  242.   MAPI_E_USER_ABORT                  = MAPI_USER_ABORT;
  243.   MAPI_E_FAILURE = 2; 
  244.   MAPI_E_LOGON_FAILURE = 3; 
  245.   MAPI_E_LOGIN_FAILURE               = MAPI_E_LOGON_FAILURE; 
  246.   MAPI_E_DISK_FULL = 4; 
  247.   MAPI_E_INSUFFICIENT_MEMORY = 5; 
  248.   MAPI_E_ACCESS_DENIED = 6; 
  249.   MAPI_E_TOO_MANY_SESSIONS = 8; 
  250.   MAPI_E_TOO_MANY_FILES = 9; 
  251.   MAPI_E_TOO_MANY_RECIPIENTS = 10; 
  252.   MAPI_E_ATTACHMENT_NOT_FOUND = 11;
  253.   MAPI_E_ATTACHMENT_OPEN_FAILURE = 12;
  254.   MAPI_E_ATTACHMENT_WRITE_FAILURE = 13;
  255.   MAPI_E_UNKNOWN_RECIPIENT = 14;
  256.   MAPI_E_BAD_RECIPTYPE = 15;
  257.   MAPI_E_NO_MESSAGES = 16;
  258.   MAPI_E_INVALID_MESSAGE = 17;
  259.   MAPI_E_TEXT_TOO_LARGE = 18;
  260.   MAPI_E_INVALID_SESSION = 19;
  261.   MAPI_E_TYPE_NOT_SUPPORTED = 20;
  262.   MAPI_E_AMBIGUOUS_RECIPIENT = 21;
  263.   MAPI_E_AMBIG_RECIP                 = MAPI_E_AMBIGUOUS_RECIPIENT;
  264.   MAPI_E_MESSAGE_IN_USE = 22;
  265.   MAPI_E_NETWORK_FAILURE = 23;
  266.   MAPI_E_INVALID_EDITFIELDS = 24;
  267.   MAPI_E_INVALID_RECIPS = 25;
  268.   MAPI_E_NOT_SUPPORTED = 26;
  269.  
  270. { Delphi wrapper calls around Simple MAPI }
  271.  
  272. function MapiLogOn(ulUIParam: Cardinal; lpszProfileName: LPSTR;
  273.   lpszPassword: LPSTR; flFlags: FLAGS; ulReserved: Cardinal;
  274.   lplhSession: PLHANDLE): Cardinal;
  275.  
  276. function MapiLogOff(lhSession: LHANDLE; ulUIParam: Cardinal; flFlags: FLAGS;
  277.   ulReserved: Cardinal): Cardinal;
  278.  
  279. function MapiSendMail(lhSession: LHANDLE; ulUIParam: Cardinal;
  280.   var lpMessage: TMapiMessage; flFlags: FLAGS; ulReserved: Cardinal): Cardinal;
  281.  
  282. function MapiSendDocuments(ulUIParam: Cardinal; lpszDelimChar: LPSTR;
  283.   lpszFilePaths: LPSTR; lpszFileNames: LPSTR; ulReserved: Cardinal): Cardinal;
  284.  
  285. function MapiFindNext(lhSession: LHANDLE; ulUIParam: Cardinal;
  286.   lpszMessageType: LPSTR; lpszSeedMessageID: LPSTR; flFlags: FLAGS;
  287.   ulReserved: Cardinal; lpszMessageID: LPSTR): Cardinal;
  288.  
  289. function MapiReadMail(lhSession: LHANDLE; ulUIParam: Cardinal;
  290.   lpszMessageID: LPSTR; flFlags: FLAGS; ulReserved: Cardinal;
  291.   var lppMessage: PMapiMessage): Cardinal;
  292.  
  293. function MapiSaveMail(lhSession: LHANDLE; ulUIParam: Cardinal;
  294.   var lpMessage: TMapiMessage; flFlags: FLAGS; ulReserved: Cardinal;
  295.   lpszMessageID: LPSTR): Cardinal;
  296.  
  297. function MapiDeleteMail(lhSession: LHANDLE; ulUIParam: Cardinal;
  298.   lpszMessageID: LPSTR; flFlags: FLAGS;
  299.   ulReserved: Cardinal): Cardinal;
  300.  
  301. function MapiFreeBuffer(pv: Pointer): Cardinal;
  302.  
  303. function MapiAddress(lhSession: LHANDLE; ulUIParam: Cardinal;
  304.   lpszCaption: LPSTR; nEditFields: Cardinal; lpszLabels: LPSTR;
  305.   nRecips: Cardinal; var lpRecips: TMapiRecipDesc; flFlags: FLAGS;
  306.   ulReserved: Cardinal; lpnNewRecips: PULONG;
  307.   var lppNewRecips: PMapiRecipDesc): Cardinal;
  308.  
  309. function MapiDetails(lhSession: LHANDLE; ulUIParam: Cardinal;
  310.   var lpRecip: TMapiRecipDesc; flFlags: FLAGS;
  311.   ulReserved: Cardinal): Cardinal;
  312.  
  313. function MapiResolveName(lhSession: LHANDLE; ulUIParam: Cardinal;
  314.   lpszName: LPSTR; flFlags: FLAGS; ulReserved: Cardinal;
  315.   var lppRecip: PMapiRecipDesc): Cardinal;
  316.  
  317. var
  318.   MAPIDLL: string = 'MAPI32.DLL';
  319.  
  320. implementation
  321.  
  322. var
  323.   MAPIModule: HModule = 0;
  324.   LogOn: TFNMapiLogOn = nil;
  325.   LogOff: TFNMapiLogOff = nil;
  326.   SendMail: TFNMapiSendMail = nil;
  327.   SendDocuments: TFNMapiSendDocuments = nil;
  328.   FindNext: TFNMapiFindNext = nil;
  329.   ReadMail: TFNMapiReadMail = nil;
  330.   SaveMail: TFNMapiSaveMail = nil;
  331.   DeleteMail: TFNMapiDeleteMail = nil;
  332.   FreeBuffer: TFNMapiFreeBuffer = nil;
  333.   Address: TFNMapiAddress = nil;
  334.   Details: TFNMapiDetails = nil;
  335.   ResolveName: TFNMapiResolveName = nil;
  336.  
  337. procedure InitMapi;
  338. begin
  339.   if MAPIModule = 0 then
  340.     MAPIModule := LoadLibrary(PChar(MAPIDLL));
  341. end;
  342.  
  343. function MapiLogOn(ulUIParam: Cardinal; lpszProfileName: LPSTR; 
  344.   lpszPassword: LPSTR; flFlags: FLAGS; ulReserved: Cardinal; 
  345.   lplhSession: PLHANDLE): Cardinal;
  346. begin
  347.   InitMapi;
  348.   if @LogOn = nil then
  349.     @LogOn := GetProcAddress(MAPIModule, 'MAPILogon');
  350.   if @LogOn <> nil then
  351.     Result := LogOn(ulUIParam, lpszProfileName, lpszPassword, flFlags,
  352.       ulReserved, lplhSession)
  353.   else Result := 1;
  354. end;
  355.  
  356. function MapiLogOff(lhSession: LHANDLE; ulUIParam: Cardinal; flFlags: FLAGS; 
  357.   ulReserved: Cardinal): Cardinal;
  358. begin
  359.   InitMapi;
  360.   if @LogOff = nil then
  361.     @LogOff := GetProcAddress(MAPIModule, 'MAPILogoff');
  362.   if @LogOff <> nil then
  363.     Result := LogOff(lhSession, ulUIParam, flFlags, ulReserved)
  364.   else Result := 1;
  365. end;
  366.  
  367. function MapiSendMail(lhSession: LHANDLE; ulUIParam: Cardinal;
  368.   var lpMessage: TMapiMessage; flFlags: FLAGS; ulReserved: Cardinal): Cardinal;
  369. begin
  370.   InitMapi;
  371.   if @SendMail = nil then
  372.     @SendMail := GetProcAddress(MAPIModule, 'MAPISendMail');
  373.   if @SendMail <> nil then
  374.     Result := SendMail(lhSession, ulUIParam, lpMessage, flFlags, ulReserved)
  375.   else Result := 1;
  376. end;
  377.  
  378. function MapiSendDocuments(ulUIParam: Cardinal; lpszDelimChar: LPSTR; 
  379.   lpszFilePaths: LPSTR; lpszFileNames: LPSTR; 
  380.   ulReserved: Cardinal): Cardinal;
  381. begin
  382.   InitMapi;
  383.   if @SendDocuments = nil then
  384.     @SendDocuments := GetProcAddress(MAPIModule, 'MAPISendDocuments');
  385.   if @SendDocuments <> nil then
  386.     Result := SendDocuments(ulUIParam, lpszDelimChar, lpszFilePaths,
  387.       lpszFileNames, ulReserved)
  388.   else Result := 1;
  389. end;
  390.  
  391. function MapiFindNext(lhSession: LHANDLE; ulUIParam: Cardinal;
  392.   lpszMessageType: LPSTR; lpszSeedMessageID: LPSTR; flFlags: FLAGS;
  393.   ulReserved: Cardinal; lpszMessageID: LPSTR): Cardinal;
  394. begin
  395.   InitMapi;
  396.   if @FindNext = nil then
  397.     @FindNext := GetProcAddress(MAPIModule, 'MAPIFindNext');
  398.   if @FindNext <> nil then
  399.     Result := FindNext(lhSession, ulUIParam, lpszMessageType,
  400.       lpszSeedMessageID, flFlags, ulReserved, lpszMessageID)
  401.   else Result := 1;
  402. end;
  403.  
  404. function MapiReadMail(lhSession: LHANDLE; ulUIParam: Cardinal;
  405.   lpszMessageID: LPSTR; flFlags: FLAGS; ulReserved: Cardinal;
  406.   var lppMessage: PMapiMessage): Cardinal;
  407. begin
  408.   InitMapi;
  409.   if @ReadMail = nil then
  410.     @ReadMail := GetProcAddress(MAPIModule, 'MAPIReadMail');
  411.   if @ReadMail <> nil then
  412.     Result := ReadMail(lhSession, ulUIParam, lpszMessageID, flFlags,
  413.       ulReserved, lppMessage)
  414.   else Result := 1;
  415. end;
  416.  
  417. function MapiSaveMail(lhSession: LHANDLE; ulUIParam: Cardinal;
  418.   var lpMessage: TMapiMessage; flFlags: FLAGS; ulReserved: Cardinal;
  419.   lpszMessageID: LPSTR): Cardinal;
  420. begin
  421.   InitMapi;
  422.   if @SaveMail = nil then
  423.     @SaveMail := GetProcAddress(MAPIModule, 'MAPISaveMail');
  424.   if @SaveMail <> nil then
  425.     Result := SaveMail(lhSession, ulUIParam, lpMessage, flFlags, ulReserved,
  426.       lpszMessageID)
  427.   else Result := 1;
  428. end;
  429.  
  430. function MapiDeleteMail(lhSession: LHANDLE; ulUIParam: Cardinal;
  431.   lpszMessageID: LPSTR; flFlags: FLAGS;
  432.   ulReserved: Cardinal): Cardinal;
  433. begin
  434.   InitMapi;
  435.   if @DeleteMail = nil then
  436.     @DeleteMail := GetProcAddress(MAPIModule, 'MAPIDeleteMail');
  437.   if @DeleteMail <> nil then
  438.     Result := DeleteMail(lhSession, ulUIParam, lpszMessageID, flFlags,
  439.       ulReserved)
  440.   else Result := 1;
  441. end;
  442.  
  443. function MapiFreeBuffer(pv: Pointer): Cardinal;
  444. begin
  445.   InitMapi;
  446.   if @FreeBuffer = nil then
  447.     @FreeBuffer := GetProcAddress(MAPIModule, 'MAPIFreeBuffer');
  448.   if @FreeBuffer <> nil then
  449.     Result := FreeBuffer(pv)
  450.   else Result := 1;
  451. end;
  452.  
  453. function MapiAddress(lhSession: LHANDLE; ulUIParam: Cardinal;
  454.   lpszCaption: LPSTR; nEditFields: Cardinal; lpszLabels: LPSTR;
  455.   nRecips: Cardinal; var lpRecips: TMapiRecipDesc; flFlags: FLAGS;
  456.   ulReserved: Cardinal; lpnNewRecips: PULONG;
  457.   var lppNewRecips: PMapiRecipDesc): Cardinal;
  458. begin
  459.   InitMapi;
  460.   if @Address = nil then
  461.     @Address := GetProcAddress(MAPIModule, 'MAPIAddress');
  462.   if @Address <> nil then
  463.     Result := Address(lhSession, ulUIParam, lpszCaption, nEditFields,
  464.       lpszLabels, nRecips, lpRecips, flFlags, ulReserved, lpnNewRecips,
  465.       lppNewRecips)
  466.   else Result := 1;
  467. end;
  468.  
  469. function MapiDetails(lhSession: LHANDLE; ulUIParam: Cardinal;
  470.   var lpRecip: TMapiRecipDesc; flFlags: FLAGS; ulReserved: Cardinal): Cardinal;
  471. begin
  472.   InitMapi;
  473.   if @Details = nil then
  474.     @Details := GetProcAddress(MAPIModule, 'MAPIDetails');
  475.   if @Details <> nil then
  476.     Result := Details(lhSession, ulUIParam, lpRecip, flFlags, ulReserved)
  477.   else Result := 1;
  478. end;
  479.  
  480. function MapiResolveName(lhSession: LHANDLE; ulUIParam: Cardinal;
  481.   lpszName: LPSTR; flFlags: FLAGS; ulReserved: Cardinal;
  482.   var lppRecip: PMapiRecipDesc): Cardinal;
  483. begin
  484.   InitMapi;
  485.   if @ResolveName = nil then
  486.     @ResolveName := GetProcAddress(MAPIModule, 'MAPIResolveName');
  487.   if @ResolveName <> nil then
  488.     Result := ResolveName(lhSession, ulUIParam, lpszName, flFlags,
  489.       ulReserved, lppRecip)
  490.   else Result := 1;
  491. end;
  492.  
  493. initialization
  494. finalization
  495.   if MAPIModule <> 0 then FreeLibrary(MAPIModule);
  496. end.
  497.