JwaMsi.pas
上传用户:davidchvip
上传日期:2009-07-28
资源大小:1749k
文件大小:161k
源码类别:

Windows编程

开发平台:

Delphi

  1. {******************************************************************************}
  2. {                                                                       }
  3. { Windows Installer API interface Unit for Object Pascal                       }
  4. {                                                                       }
  5. { Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft          }
  6. { Corporation. All Rights Reserved.                                            }
  7. {                 }
  8. { The original file is: msi.h, released June 2000. The original Pascal         }
  9. { code is: Msi.pas, released June 2001. The initial developer of the           }
  10. { Pascal code is Marcel van Brakel (brakelm@chello.nl).                        }
  11. {                                                                              }
  12. { Portions created by Marcel van Brakel are Copyright (C) 1999-2001            }
  13. { Marcel van Brakel. All Rights Reserved.                                      }
  14. {                 }
  15. { Contributors: Steve Moss (spm@coco.co.uk)                                    }
  16. {                                                                              }
  17. { Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI)        }
  18. {                }
  19. { You may retrieve the latest version of this file at the Project JEDI home    }
  20. { page, located at http://delphi-jedi.org or my personal homepage located at   }
  21. { http://members.chello.nl/m.vanbrakel2                                        }
  22. {                }
  23. { The contents of this file are used with permission, subject to the Mozilla   }
  24. { Public License Version 1.1 (the "License"); you may not use this file except }
  25. { in compliance with the License. You may obtain a copy of the License at      }
  26. { http://www.mozilla.org/MPL/MPL-1.1.html                                      }
  27. {                                                                              }
  28. { Software distributed under the License is distributed on an "AS IS" basis,   }
  29. { WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
  30. { the specific language governing rights and limitations under the License.    }
  31. {                                                                              }
  32. { Alternatively, the contents of this file may be used under the terms of the  }
  33. { GNU Lesser General Public License (the  "LGPL License"), in which case the   }
  34. { provisions of the LGPL License are applicable instead of those above.        }
  35. { If you wish to allow use of your version of this file only under the terms   }
  36. { of the LGPL License and not to allow others to use your version of this file }
  37. { under the MPL, indicate your decision by deleting  the provisions above and  }
  38. { replace  them with the notice and other provisions required by the LGPL      }
  39. { License.  If you do not delete the provisions above, a recipient may use     }
  40. { your version of this file under either the MPL or the LGPL License.          }
  41. {                 }
  42. { For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
  43. {                 }
  44. {******************************************************************************}
  45. unit JwaMsi;
  46. {$WEAKPACKAGEUNIT}
  47. {$HPPEMIT ''}
  48. {$HPPEMIT '#include "msi.h"'}
  49. {$HPPEMIT ''}
  50. {$I WINDEFINES.INC}
  51. interface
  52. uses
  53.   JwaWinType, JwaWinCrypt { for PCCERT_CONTEXT };
  54. type // TODO
  55.   LPVOID = Pointer;
  56.   PHWND = ^HWND;
  57. {$DEFINE WIN32_NT_GREATER_EQUAL_0500}
  58. {$IFDEF WIN32_WINNT_GREATER_EQUAL_0501}
  59.   {$DEFINE _WIN32_MSI_200}
  60.   {$DEFINE _WIN32_MSI_GREATER_EQUAL_110} // not in original!!  
  61. {$ELSE}
  62.   {$IFDEF WIN32_NT_GREATER_EQUAL_0500}
  63.     {$DEFINE WIN32_MSI_110}
  64.   {$ELSE}
  65.     {$DEFINE WIN32_MSI_100}
  66.   {$ENDIF WIN32_NT_GREATER_EQUAL_0500}
  67. {$ENDIF WIN32_WINNT_GREATER_EQUAL_0501}
  68. (*****************************************************************************
  69. *                                                                             *
  70. * msi.h - - Interface for external access to Installer Service                *
  71. *                                                                             *
  72. * Version 1.0 - 1.2                                                           *
  73. *                                                                             *
  74. * NOTES:  All buffers sizes are TCHAR count, null included only on input      *
  75. *         Return argument pointers may be null if not interested in value     *
  76. *                                                                             *
  77. * Copyright (c) 1999-2000, Microsoft Corp.      All rights reserved.          *
  78. *                                                                             *
  79. *****************************************************************************)
  80. // --------------------------------------------------------------------------
  81. // Installer generic handle definitions
  82. // --------------------------------------------------------------------------
  83. type
  84.   MSIHANDLE = DWORD;     // abstract generic handle, 0 == no handle
  85.   {$EXTERNALSYM MSIHANDLE}
  86.   TMsiHandle = MSIHANDLE;
  87. // Close a open handle of any type
  88. // All handles obtained from API calls must be closed when no longer needed
  89. // Normally succeeds, returning TRUE.
  90. function MsiCloseHandle(hAny: MSIHANDLE): UINT; stdcall;
  91. {$EXTERNALSYM MsiCloseHandle}
  92. // Close all handles open in the process, a diagnostic call
  93. // This should NOT be used as a cleanup mechanism -- use PMSIHANDLE class
  94. // Can be called at termination to assure that all handles have been closed
  95. // Returns 0 if all handles have been close, else number of open handles
  96. function MsiCloseAllHandles: UINT; stdcall;
  97. {$EXTERNALSYM MsiCloseAllHandles}
  98. // Install message type for callback is a combination of the following:
  99. //  A message box style:      MB_*, where MB_OK is the default
  100. //  A message box icon type:  MB_ICON*, where no icon is the default
  101. //  A default button:         MB_DEFBUTTON?, where MB_DEFBUTTON1 is the default
  102. //  One of the following install message types, no default
  103. const
  104.   INSTALLMESSAGE_FATALEXIT      = $00000000; // premature termination, possibly fatal OOM
  105.   {$EXTERNALSYM INSTALLMESSAGE_FATALEXIT}
  106.   INSTALLMESSAGE_ERROR          = $01000000; // formatted error message
  107.   {$EXTERNALSYM INSTALLMESSAGE_ERROR}
  108.   INSTALLMESSAGE_WARNING        = $02000000; // formatted warning message
  109.   {$EXTERNALSYM INSTALLMESSAGE_WARNING}
  110.   INSTALLMESSAGE_USER           = $03000000; // user request message
  111.   {$EXTERNALSYM INSTALLMESSAGE_USER}
  112.   INSTALLMESSAGE_INFO           = $04000000; // informative message for log
  113.   {$EXTERNALSYM INSTALLMESSAGE_INFO}
  114.   INSTALLMESSAGE_FILESINUSE     = $05000000; // list of files in use that need to be replaced
  115.   {$EXTERNALSYM INSTALLMESSAGE_FILESINUSE}
  116.   INSTALLMESSAGE_RESOLVESOURCE  = $06000000; // request to determine a valid source location
  117.   {$EXTERNALSYM INSTALLMESSAGE_RESOLVESOURCE}
  118.   INSTALLMESSAGE_OUTOFDISKSPACE = $07000000; // insufficient disk space message
  119.   {$EXTERNALSYM INSTALLMESSAGE_OUTOFDISKSPACE}
  120.   INSTALLMESSAGE_ACTIONSTART    = $08000000; // start of action: action name & description
  121.   {$EXTERNALSYM INSTALLMESSAGE_ACTIONSTART}
  122.   INSTALLMESSAGE_ACTIONDATA     = $09000000; // formatted data associated with individual action item
  123.   {$EXTERNALSYM INSTALLMESSAGE_ACTIONDATA}
  124.   INSTALLMESSAGE_PROGRESS       = $0A000000; // progress gauge info: units so far, total
  125.   {$EXTERNALSYM INSTALLMESSAGE_PROGRESS}
  126.   INSTALLMESSAGE_COMMONDATA     = $0B000000; // product info for dialog: language Id, dialog caption
  127.   {$EXTERNALSYM INSTALLMESSAGE_COMMONDATA}
  128.   INSTALLMESSAGE_INITIALIZE     = $0C000000; // sent prior to UI initialization, no string data
  129.   {$EXTERNALSYM INSTALLMESSAGE_INITIALIZE}
  130.   INSTALLMESSAGE_TERMINATE      = $0D000000; // sent after UI termination, no string data
  131.   {$EXTERNALSYM INSTALLMESSAGE_TERMINATE}
  132.   INSTALLMESSAGE_SHOWDIALOG     = $0E000000; // sent prior to display or authored dialog or wizard
  133.   {$EXTERNALSYM INSTALLMESSAGE_SHOWDIALOG}
  134. type
  135.   INSTALLMESSAGE = Longint;
  136.   {$EXTERNALSYM INSTALLMESSAGE}
  137.   TInstallMessage = INSTALLMESSAGE;
  138. // external error handler supplied to installation API functions
  139. type
  140.   INSTALLUI_HANDLERA = function (pvContext: LPVOID; iMessageType: UINT; szMessage: LPCSTR): Integer; stdcall;
  141.   {$EXTERNALSYM INSTALLUI_HANDLERA}
  142.   TInstallUIHandlerA = INSTALLUI_HANDLERA;
  143.   INSTALLUI_HANDLERW = function (pvContext: LPVOID; iMessageType: UINT; szMessage: LPCWSTR): Integer; stdcall;
  144.   {$EXTERNALSYM INSTALLUI_HANDLERW}
  145.   TInstallUIHandlerW = INSTALLUI_HANDLERW;
  146. {$IFDEF UNICODE}
  147.   INSTALLUI_HANDLER = INSTALLUI_HANDLERW;
  148.   {$EXTERNALSYM INSTALLUI_HANDLER}
  149.   TInstallUIHandler = TInstallUIHandlerW;
  150. {$ELSE}
  151.   INSTALLUI_HANDLER = INSTALLUI_HANDLERA;
  152.   {$EXTERNALSYM INSTALLUI_HANDLER}
  153.   TInstallUIHandler = TInstallUIHandlerA;  
  154. {$ENDIF}
  155. const
  156.   INSTALLUILEVEL_NOCHANGE = 0;    // UI level is unchanged
  157.   {$EXTERNALSYM INSTALLUILEVEL_NOCHANGE}
  158.   INSTALLUILEVEL_DEFAULT  = 1;    // default UI is used
  159.   {$EXTERNALSYM INSTALLUILEVEL_DEFAULT}
  160.   INSTALLUILEVEL_NONE     = 2;    // completely silent installation
  161.   {$EXTERNALSYM INSTALLUILEVEL_NONE}
  162.   INSTALLUILEVEL_BASIC    = 3;    // simple progress and error handling
  163.   {$EXTERNALSYM INSTALLUILEVEL_BASIC}
  164.   INSTALLUILEVEL_REDUCED  = 4;    // authored UI, wizard dialogs suppressed
  165.   {$EXTERNALSYM INSTALLUILEVEL_REDUCED}
  166.   INSTALLUILEVEL_FULL     = 5;    // authored UI with wizards, progress, errors
  167.   {$EXTERNALSYM INSTALLUILEVEL_FULL}
  168.   INSTALLUILEVEL_ENDDIALOG    = $80; // display success/failure dialog at end of install
  169.   {$EXTERNALSYM INSTALLUILEVEL_ENDDIALOG}
  170.   INSTALLUILEVEL_PROGRESSONLY = $40; // display only progress dialog
  171.   {$EXTERNALSYM INSTALLUILEVEL_PROGRESSONLY}
  172.   INSTALLUILEVEL_HIDECANCEL   = $20; // do not display the cancel button in basic UI
  173.   {$EXTERNALSYM INSTALLUILEVEL_HIDECANCEL}
  174.   INSTALLUILEVEL_SOURCERESONLY = $100; // force display of source resolution even if quiet
  175.   {$EXTERNALSYM INSTALLUILEVEL_SOURCERESONLY}
  176. type
  177.   INSTALLUILEVEL = Longint;
  178.   {$EXTERNALSYM INSTALLUILEVEL}
  179.   TInstallUILevel = INSTALLUILEVEL;
  180. const
  181.   INSTALLSTATE_NOTUSED      = -7;  // component disabled
  182.   {$EXTERNALSYM INSTALLSTATE_NOTUSED}
  183.   INSTALLSTATE_BADCONFIG    = -6;  // configuration data corrupt
  184.   {$EXTERNALSYM INSTALLSTATE_BADCONFIG}
  185.   INSTALLSTATE_INCOMPLETE   = -5;  // installation suspended or in progress
  186.   {$EXTERNALSYM INSTALLSTATE_INCOMPLETE}
  187.   INSTALLSTATE_SOURCEABSENT = -4;  // run from source, source is unavailable
  188.   {$EXTERNALSYM INSTALLSTATE_SOURCEABSENT}
  189.   INSTALLSTATE_MOREDATA     = -3;  // return buffer overflow
  190.   {$EXTERNALSYM INSTALLSTATE_MOREDATA}
  191.   INSTALLSTATE_INVALIDARG   = -2;  // invalid function argument
  192.   {$EXTERNALSYM INSTALLSTATE_INVALIDARG}
  193.   INSTALLSTATE_UNKNOWN      = -1;  // unrecognized product or feature
  194.   {$EXTERNALSYM INSTALLSTATE_UNKNOWN}
  195.   INSTALLSTATE_BROKEN       =  0;  // broken
  196.   {$EXTERNALSYM INSTALLSTATE_BROKEN}
  197.   INSTALLSTATE_ADVERTISED   =  1;  // advertised feature
  198.   {$EXTERNALSYM INSTALLSTATE_ADVERTISED}
  199.   INSTALLSTATE_REMOVED      =  1;  // component being removed (action state, not settable)
  200.   {$EXTERNALSYM INSTALLSTATE_REMOVED}
  201.   INSTALLSTATE_ABSENT       =  2;  // uninstalled (or action state absent but clients remain)
  202.   {$EXTERNALSYM INSTALLSTATE_ABSENT}
  203.   INSTALLSTATE_LOCAL        =  3;  // installed on local drive
  204.   {$EXTERNALSYM INSTALLSTATE_LOCAL}
  205.   INSTALLSTATE_SOURCE       =  4;  // run from source, CD or net
  206.   {$EXTERNALSYM INSTALLSTATE_SOURCE}
  207.   INSTALLSTATE_DEFAULT      =  5;  // use default, local or source
  208.   {$EXTERNALSYM INSTALLSTATE_DEFAULT}
  209. type
  210.   INSTALLSTATE = Longint;
  211.   {$EXTERNALSYM INSTALLSTATE}
  212.   TInstallState = INSTALLSTATE;
  213. const
  214.   USERINFOSTATE_MOREDATA   = -3;  // return buffer overflow
  215.   {$EXTERNALSYM USERINFOSTATE_MOREDATA}
  216.   USERINFOSTATE_INVALIDARG = -2;  // invalid function argument
  217.   {$EXTERNALSYM USERINFOSTATE_INVALIDARG}
  218.   USERINFOSTATE_UNKNOWN    = -1;  // unrecognized product
  219.   {$EXTERNALSYM USERINFOSTATE_UNKNOWN}
  220.   USERINFOSTATE_ABSENT     =  0;  // user info and PID not initialized
  221.   {$EXTERNALSYM USERINFOSTATE_ABSENT}
  222.   USERINFOSTATE_PRESENT    =  1;  // user info and PID initialized
  223.   {$EXTERNALSYM USERINFOSTATE_PRESENT}
  224. type
  225.   USERINFOSTATE = DWORD;
  226.   {$EXTERNALSYM USERINFOSTATE}
  227.   TUserInfoState = USERINFOSTATE;
  228. const
  229.   INSTALLLEVEL_DEFAULT = 0;      // install authored default
  230.   {$EXTERNALSYM INSTALLLEVEL_DEFAULT}
  231.   INSTALLLEVEL_MINIMUM = 1;      // install only required features
  232.   {$EXTERNALSYM INSTALLLEVEL_MINIMUM}
  233.   INSTALLLEVEL_MAXIMUM = $FFFF;  // install all features
  234.   {$EXTERNALSYM INSTALLLEVEL_MAXIMUM}
  235. type
  236.   INSTALLLEVEL = DWORD;                   // intermediate levels dependent on authoring
  237.   {$EXTERNALSYM INSTALLLEVEL}
  238.   TInstallLevel = INSTALLLEVEL;
  239. const
  240.   REINSTALLMODE_REPAIR           = $00000001;  // Reserved bit - currently ignored
  241.   {$EXTERNALSYM REINSTALLMODE_REPAIR}
  242.   REINSTALLMODE_FILEMISSING      = $00000002;  // Reinstall only if file is missing
  243.   {$EXTERNALSYM REINSTALLMODE_FILEMISSING}
  244.   REINSTALLMODE_FILEOLDERVERSION = $00000004;  // Reinstall if file is missing, or older version
  245.   {$EXTERNALSYM REINSTALLMODE_FILEOLDERVERSION}
  246.   REINSTALLMODE_FILEEQUALVERSION = $00000008;  // Reinstall if file is missing, or equal or older version
  247.   {$EXTERNALSYM REINSTALLMODE_FILEEQUALVERSION}
  248.   REINSTALLMODE_FILEEXACT        = $00000010;  // Reinstall if file is missing, or not exact version
  249.   {$EXTERNALSYM REINSTALLMODE_FILEEXACT}
  250.   REINSTALLMODE_FILEVERIFY       = $00000020;  // checksum executables, reinstall if missing or corrupt
  251.   {$EXTERNALSYM REINSTALLMODE_FILEVERIFY}
  252.   REINSTALLMODE_FILEREPLACE      = $00000040;  // Reinstall all files, regardless of version
  253.   {$EXTERNALSYM REINSTALLMODE_FILEREPLACE}
  254.   REINSTALLMODE_MACHINEDATA      = $00000080;  // insure required machine reg entries
  255.   {$EXTERNALSYM REINSTALLMODE_MACHINEDATA}
  256.   REINSTALLMODE_USERDATA         = $00000100;  // insure required user reg entries
  257.   {$EXTERNALSYM REINSTALLMODE_USERDATA}
  258.   REINSTALLMODE_SHORTCUT         = $00000200;  // validate shortcuts items
  259.   {$EXTERNALSYM REINSTALLMODE_SHORTCUT}
  260.   REINSTALLMODE_PACKAGE          = $00000400;  // use re-cache source install package
  261.   {$EXTERNALSYM REINSTALLMODE_PACKAGE}
  262. type
  263.   REINSTALLMODE = DWORD;
  264.   {$EXTERNALSYM REINSTALLMODE}
  265.   TReinstallMode = REINSTALLMODE;
  266. // bit flags for use with MsiEnableLog and MsiSetExternalUI
  267. const
  268.   INSTALLLOGMODE_FATALEXIT      = (1 shl (INSTALLMESSAGE_FATALEXIT      shr 24));
  269.   {$EXTERNALSYM INSTALLLOGMODE_FATALEXIT}
  270.   INSTALLLOGMODE_ERROR          = (1 shl (INSTALLMESSAGE_ERROR          shr 24));
  271.   {$EXTERNALSYM INSTALLLOGMODE_ERROR}
  272.   INSTALLLOGMODE_WARNING        = (1 shl (INSTALLMESSAGE_WARNING        shr 24));
  273.   {$EXTERNALSYM INSTALLLOGMODE_WARNING}
  274.   INSTALLLOGMODE_USER           = (1 shl (INSTALLMESSAGE_USER           shr 24));
  275.   {$EXTERNALSYM INSTALLLOGMODE_USER}
  276.   INSTALLLOGMODE_INFO           = (1 shl (INSTALLMESSAGE_INFO           shr 24));
  277.   {$EXTERNALSYM INSTALLLOGMODE_INFO}
  278.   INSTALLLOGMODE_RESOLVESOURCE  = (1 shl (INSTALLMESSAGE_RESOLVESOURCE  shr 24));
  279.   {$EXTERNALSYM INSTALLLOGMODE_RESOLVESOURCE}
  280.   INSTALLLOGMODE_OUTOFDISKSPACE = (1 shl (INSTALLMESSAGE_OUTOFDISKSPACE shr 24));
  281.   {$EXTERNALSYM INSTALLLOGMODE_OUTOFDISKSPACE}
  282.   INSTALLLOGMODE_ACTIONSTART    = (1 shl (INSTALLMESSAGE_ACTIONSTART    shr 24));
  283.   {$EXTERNALSYM INSTALLLOGMODE_ACTIONSTART}
  284.   INSTALLLOGMODE_ACTIONDATA     = (1 shl (INSTALLMESSAGE_ACTIONDATA     shr 24));
  285.   {$EXTERNALSYM INSTALLLOGMODE_ACTIONDATA}
  286.   INSTALLLOGMODE_COMMONDATA     = (1 shl (INSTALLMESSAGE_COMMONDATA     shr 24));
  287.   {$EXTERNALSYM INSTALLLOGMODE_COMMONDATA}
  288.   INSTALLLOGMODE_PROPERTYDUMP   = (1 shl (INSTALLMESSAGE_PROGRESS       shr 24)); // log only
  289.   {$EXTERNALSYM INSTALLLOGMODE_PROPERTYDUMP}
  290.   INSTALLLOGMODE_VERBOSE        = (1 shl (INSTALLMESSAGE_INITIALIZE     shr 24)); // log only
  291.   {$EXTERNALSYM INSTALLLOGMODE_VERBOSE}
  292.   INSTALLLOGMODE_PROGRESS       = (1 shl (INSTALLMESSAGE_PROGRESS       shr 24)); // external handler only
  293.   {$EXTERNALSYM INSTALLLOGMODE_PROGRESS}
  294.   INSTALLLOGMODE_INITIALIZE     = (1 shl (INSTALLMESSAGE_INITIALIZE     shr 24)); // external handler only
  295.   {$EXTERNALSYM INSTALLLOGMODE_INITIALIZE}
  296.   INSTALLLOGMODE_TERMINATE      = (1 shl (INSTALLMESSAGE_TERMINATE      shr 24)); // external handler only
  297.   {$EXTERNALSYM INSTALLLOGMODE_TERMINATE}
  298.   INSTALLLOGMODE_SHOWDIALOG     = (1 shl (INSTALLMESSAGE_SHOWDIALOG     shr 24)); // external handler only
  299.   {$EXTERNALSYM INSTALLLOGMODE_SHOWDIALOG}
  300. type
  301.   INSTALLLOGMODE = DWORD;
  302.   {$EXTERNALSYM INSTALLLOGMODE}
  303.   TInstallLogMode = INSTALLLOGMODE;
  304. const
  305.   INSTALLLOGATTRIBUTES_APPEND            = (1 shl 0);
  306.   {$EXTERNALSYM INSTALLLOGATTRIBUTES_APPEND}
  307.   INSTALLLOGATTRIBUTES_FLUSHEACHLINE     = (1 shl 1);
  308.   {$EXTERNALSYM INSTALLLOGATTRIBUTES_FLUSHEACHLINE}
  309. type
  310.   INSTALLLOGATTRIBUTES = DWORD;
  311.   {$EXTERNALSYM INSTALLLOGATTRIBUTES}
  312.   TInstallLogAttributes = INSTALLLOGATTRIBUTES;
  313. const
  314.   INSTALLFEATUREATTRIBUTE_FAVORLOCAL             = 1 shl 0;
  315.   {$EXTERNALSYM INSTALLFEATUREATTRIBUTE_FAVORLOCAL}
  316.   INSTALLFEATUREATTRIBUTE_FAVORSOURCE            = 1 shl 1;
  317.   {$EXTERNALSYM INSTALLFEATUREATTRIBUTE_FAVORSOURCE}
  318.   INSTALLFEATUREATTRIBUTE_FOLLOWPARENT           = 1 shl 2;
  319.   {$EXTERNALSYM INSTALLFEATUREATTRIBUTE_FOLLOWPARENT}
  320.   INSTALLFEATUREATTRIBUTE_FAVORADVERTISE         = 1 shl 3;
  321.   {$EXTERNALSYM INSTALLFEATUREATTRIBUTE_FAVORADVERTISE}
  322.   INSTALLFEATUREATTRIBUTE_DISALLOWADVERTISE      = 1 shl 4;
  323.   {$EXTERNALSYM INSTALLFEATUREATTRIBUTE_DISALLOWADVERTISE}
  324.   INSTALLFEATUREATTRIBUTE_NOUNSUPPORTEDADVERTISE = 1 shl 5;
  325.   {$EXTERNALSYM INSTALLFEATUREATTRIBUTE_NOUNSUPPORTEDADVERTISE}
  326. type
  327.   INSTALLFEATUREATTRIBUTE = DWORD;
  328.   {$EXTERNALSYM INSTALLFEATUREATTRIBUTE}
  329.   TInstallFeatureAttribute = INSTALLFEATUREATTRIBUTE;
  330. const
  331.   INSTALLMODE_NOSOURCERESOLUTION   = -3;  // skip source resolution
  332.   {$EXTERNALSYM INSTALLMODE_NOSOURCERESOLUTION}
  333.   INSTALLMODE_NODETECTION          = -2;  // skip detection
  334.   {$EXTERNALSYM INSTALLMODE_NODETECTION}
  335.   INSTALLMODE_EXISTING             = -1;  // provide, if available
  336.   {$EXTERNALSYM INSTALLMODE_EXISTING}
  337.   INSTALLMODE_DEFAULT              =  0;  // install, if absent
  338.   {$EXTERNALSYM INSTALLMODE_DEFAULT}
  339. type
  340.   INSTALLMODE = DWORD;
  341.   {$EXTERNALSYM INSTALLMODE}
  342.   TInstallMode = INSTALLMODE;
  343. const
  344.   MAX_FEATURE_CHARS = 38;   // maximum chars in feature name (same as string GUID)
  345.   {$EXTERNALSYM MAX_FEATURE_CHARS}
  346. // Product info attributes: advertised information
  347.   INSTALLPROPERTY_PACKAGENAME    = __TEXT('PackageName');
  348.   {$EXTERNALSYM INSTALLPROPERTY_PACKAGENAME}
  349.   INSTALLPROPERTY_TRANSFORMS     = __TEXT('Transforms');
  350.   {$EXTERNALSYM INSTALLPROPERTY_TRANSFORMS}
  351.   INSTALLPROPERTY_LANGUAGE       = __TEXT('Language');
  352.   {$EXTERNALSYM INSTALLPROPERTY_LANGUAGE}
  353.   INSTALLPROPERTY_PRODUCTNAME    = __TEXT('ProductName');
  354.   {$EXTERNALSYM INSTALLPROPERTY_PRODUCTNAME}
  355.   INSTALLPROPERTY_ASSIGNMENTTYPE = __TEXT('AssignmentType');
  356.   {$EXTERNALSYM INSTALLPROPERTY_ASSIGNMENTTYPE}
  357. //#if (_WIN32_MSI >= 150)
  358.   INSTALLPROPERTY_INSTANCETYPE   = __TEXT('InstanceType');
  359.   {$EXTERNALSYM INSTALLPROPERTY_INSTANCETYPE}
  360. //#endif //(_WIN32_MSI >= 150)
  361.   INSTALLPROPERTY_PACKAGECODE    = __TEXT('PackageCode');
  362.   {$EXTERNALSYM INSTALLPROPERTY_PACKAGECODE}
  363.   INSTALLPROPERTY_VERSION        = __TEXT('Version');
  364.   {$EXTERNALSYM INSTALLPROPERTY_VERSION}
  365.   INSTALLPROPERTY_PRODUCTICON    = __TEXT('ProductIcon');
  366.   {$EXTERNALSYM INSTALLPROPERTY_PRODUCTICON}
  367. // Product info attributes: installed information
  368.   INSTALLPROPERTY_INSTALLEDPRODUCTNAME = __TEXT('InstalledProductName');
  369.   {$EXTERNALSYM INSTALLPROPERTY_INSTALLEDPRODUCTNAME}
  370.   INSTALLPROPERTY_VERSIONSTRING        = __TEXT('VersionString');
  371.   {$EXTERNALSYM INSTALLPROPERTY_VERSIONSTRING}
  372.   INSTALLPROPERTY_HELPLINK             = __TEXT('HelpLink');
  373.   {$EXTERNALSYM INSTALLPROPERTY_HELPLINK}
  374.   INSTALLPROPERTY_HELPTELEPHONE        = __TEXT('HelpTelephone');
  375.   {$EXTERNALSYM INSTALLPROPERTY_HELPTELEPHONE}
  376.   INSTALLPROPERTY_INSTALLLOCATION      = __TEXT('InstallLocation');
  377.   {$EXTERNALSYM INSTALLPROPERTY_INSTALLLOCATION}
  378.   INSTALLPROPERTY_INSTALLSOURCE        = __TEXT('InstallSource');
  379.   {$EXTERNALSYM INSTALLPROPERTY_INSTALLSOURCE}
  380.   INSTALLPROPERTY_INSTALLDATE          = __TEXT('InstallDate');
  381.   {$EXTERNALSYM INSTALLPROPERTY_INSTALLDATE}
  382.   INSTALLPROPERTY_PUBLISHER            = __TEXT('Publisher');
  383.   {$EXTERNALSYM INSTALLPROPERTY_PUBLISHER}
  384.   INSTALLPROPERTY_LOCALPACKAGE         = __TEXT('LocalPackage');
  385.   {$EXTERNALSYM INSTALLPROPERTY_LOCALPACKAGE}
  386.   INSTALLPROPERTY_URLINFOABOUT         = __TEXT('URLInfoAbout');
  387.   {$EXTERNALSYM INSTALLPROPERTY_URLINFOABOUT}
  388.   INSTALLPROPERTY_URLUPDATEINFO        = __TEXT('URLUpdateInfo');
  389.   {$EXTERNALSYM INSTALLPROPERTY_URLUPDATEINFO}
  390.   INSTALLPROPERTY_VERSIONMINOR         = __TEXT('VersionMinor');
  391.   {$EXTERNALSYM INSTALLPROPERTY_VERSIONMINOR}
  392.   INSTALLPROPERTY_VERSIONMAJOR         = __TEXT('VersionMajor');
  393.   {$EXTERNALSYM INSTALLPROPERTY_VERSIONMAJOR}
  394. const
  395.   SCRIPTFLAGS_CACHEINFO                = $00000001;   // set if the icons need to be created/ removed
  396.   {$EXTERNALSYM SCRIPTFLAGS_CACHEINFO}
  397.   SCRIPTFLAGS_SHORTCUTS                = $00000004;   // set if the shortcuts needs to be created/ deleted
  398.   {$EXTERNALSYM SCRIPTFLAGS_SHORTCUTS}
  399.   SCRIPTFLAGS_MACHINEASSIGN            = $00000008;   // set if product to be assigned to machine
  400.   {$EXTERNALSYM SCRIPTFLAGS_MACHINEASSIGN}
  401.   SCRIPTFLAGS_REGDATA_CNFGINFO         = $00000020;   // set if the product cnfg mgmt. registry data needs to be written/ removed
  402.   {$EXTERNALSYM SCRIPTFLAGS_REGDATA_CNFGINFO}
  403.   SCRIPTFLAGS_VALIDATE_TRANSFORMS_LIST = $00000040;
  404.   {$EXTERNALSYM SCRIPTFLAGS_VALIDATE_TRANSFORMS_LIST}
  405. {$IFDEF _WIN32_MSI_GREATER_EQUAL_110}
  406.   SCRIPTFLAGS_REGDATA_CLASSINFO        = $00000080;   // set if COM classes related app info needs to be  created/ deleted
  407.   {$EXTERNALSYM SCRIPTFLAGS_REGDATA_CLASSINFO}
  408.   SCRIPTFLAGS_REGDATA_EXTENSIONINFO    = $00000100;   // set if extension related app info needs to be  created/ deleted
  409.   {$EXTERNALSYM SCRIPTFLAGS_REGDATA_EXTENSIONINFO}
  410.   SCRIPTFLAGS_REGDATA_APPINFO          = SCRIPTFLAGS_REGDATA_CLASSINFO or SCRIPTFLAGS_REGDATA_EXTENSIONINFO; // for source level backward compatibility
  411.   {$EXTERNALSYM SCRIPTFLAGS_REGDATA_APPINFO}
  412. {$ELSE} // _WIN32_MSI >= 110
  413.   SCRIPTFLAGS_REGDATA_APPINFO          = $00000010;
  414.   {$EXTERNALSYM SCRIPTFLAGS_REGDATA_APPINFO}
  415. {$ENDIF}
  416.   SCRIPTFLAGS_REGDATA                  = SCRIPTFLAGS_REGDATA_APPINFO or SCRIPTFLAGS_REGDATA_CNFGINFO;// for source level backward compatibility
  417.   {$EXTERNALSYM SCRIPTFLAGS_REGDATA}
  418. type
  419.   SCRIPTFLAGS = Longint;
  420.   {$EXTERNALSYM SCRIPTFLAGS}
  421.   TScriptFlags = SCRIPTFLAGS;
  422. const
  423.   ADVERTISEFLAGS_MACHINEASSIGN   = 0;   // set if the product is to be machine assigned
  424.   {$EXTERNALSYM ADVERTISEFLAGS_MACHINEASSIGN}
  425.   ADVERTISEFLAGS_USERASSIGN      = 1;   // set if the product is to be user assigned
  426.   {$EXTERNALSYM ADVERTISEFLAGS_USERASSIGN}
  427. type
  428.   ADVERTISEFLAGS = Longint;
  429.   {$EXTERNALSYM ADVERTISEFLAGS}
  430.   TAdvertiseFlags = ADVERTISEFLAGS;
  431. const
  432.   INSTALLTYPE_DEFAULT            = 0;   // set to indicate default behavior
  433.   {$EXTERNALSYM INSTALLTYPE_DEFAULT}
  434.   INSTALLTYPE_NETWORK_IMAGE      = 1;   // set to indicate network install
  435.   {$EXTERNALSYM INSTALLTYPE_NETWORK_IMAGE}
  436.   INSTALLTYPE_SINGLE_INSTANCE    = 2;   // set to indicate a particular instance
  437.   {$EXTERNALSYM INSTALLTYPE_SINGLE_INSTANCE}
  438. type
  439.   INSTALLTYPE = DWORD;
  440.   {$EXTERNALSYM INSTALLTYPE}
  441.   TInstallType = INSTALLTYPE;
  442. type
  443.   _MSIFILEHASHINFO = record
  444.     dwFileHashInfoSize: ULONG;
  445.     dwData: array [0..3] of ULONG;
  446.   end;
  447.   {$EXTERNALSYM _MSIFILEHASHINFO}
  448.   MSIFILEHASHINFO = _MSIFILEHASHINFO;
  449.   {$EXTERNALSYM MSIFILEHASHINFO}
  450.   PMSIFILEHASHINFO = ^MSIFILEHASHINFO;
  451.   {$EXTERNALSYM PMSIFILEHASHINFO}
  452.   TMsiFileHashInfo = MSIFILEHASHINFO;
  453. const
  454.   MSIARCHITECTUREFLAGS_X86   = $00000001; // set if creating the script for i386 platform
  455.   {$EXTERNALSYM MSIARCHITECTUREFLAGS_X86}
  456.   MSIARCHITECTUREFLAGS_IA64  = $00000002; // set if creating the script for IA64 platform
  457.   {$EXTERNALSYM MSIARCHITECTUREFLAGS_IA64}
  458.   MSIARCHITECTUREFLAGS_AMD64 = $00000004; // set if creating the script for AMD64 platform
  459.   {$EXTERNALSYM MSIARCHITECTUREFLAGS_AMD64}
  460. type
  461.   MSIARCHITECTUREFLAGS = DWORD;
  462.   {$EXTERNALSYM MSIARCHITECTUREFLAGS}
  463.   TMsiArchitectureFlags = MSIARCHITECTUREFLAGS;
  464. const
  465.   MSIOPENPACKAGEFLAGS_IGNOREMACHINESTATE = $00000001; // ignore the machine state when creating the engine
  466.   {$EXTERNALSYM MSIOPENPACKAGEFLAGS_IGNOREMACHINESTATE}
  467. type
  468.   MSIOPENPACKAGEFLAGS = DWORD;
  469.   {$EXTERNALSYM MSIOPENPACKAGEFLAGS}
  470.   TMsiOpenPackageFlags = MSIOPENPACKAGEFLAGS;
  471. const
  472.   MSIADVERTISEOPTIONFLAGS_INSTANCE = $00000001; // set if advertising a new instance
  473.   {$EXTERNALSYM MSIADVERTISEOPTIONFLAGS_INSTANCE}
  474. type
  475.   tagMSIADVERTISEOPTIONFLAGS = DWORD;
  476.   {$EXTERNALSYM tagMSIADVERTISEOPTIONFLAGS}
  477.   MSIADVERTISEOPTIONFLAGS = tagMSIADVERTISEOPTIONFLAGS;
  478.   {$EXTERNALSYM MSIADVERTISEOPTIONFLAGS}
  479.   TMsiAdvertiseOptionFlags = MSIADVERTISEOPTIONFLAGS;
  480. // --------------------------------------------------------------------------
  481. // Functions to set the UI handling and logging. The UI will be used for error,
  482. // progress, and log messages for all subsequent calls to Installer Service
  483. // API functions that require UI.
  484. // --------------------------------------------------------------------------
  485. // Enable internal UI
  486. function MsiSetInternalUI(dwUILevel: INSTALLUILEVEL; phWnd: PHWND): INSTALLUILEVEL; stdcall;
  487. {$EXTERNALSYM MsiSetInternalUI}
  488. // Enable external UI handling, returns any previous handler or NULL if none.
  489. // Messages are designated with a combination of bits from INSTALLLOGMODE enum.
  490. function MsiSetExternalUIA(puiHandler: INSTALLUI_HANDLERA; dwMessageFilter: DWORD;
  491.   pvContext: LPVOID): INSTALLUI_HANDLERA; stdcall;
  492. {$EXTERNALSYM MsiSetExternalUIA}
  493. function MsiSetExternalUIW(puiHandler: INSTALLUI_HANDLERW; dwMessageFilter: DWORD;
  494.   pvContext: LPVOID): INSTALLUI_HANDLERW; stdcall;
  495. {$EXTERNALSYM MsiSetExternalUIW}
  496. {$IFDEF UNICODE}
  497. function MsiSetExternalUI(puiHandler: INSTALLUI_HANDLERW; dwMessageFilter: DWORD;
  498.   pvContext: LPVOID): INSTALLUI_HANDLERW; stdcall;
  499. {$EXTERNALSYM MsiSetExternalUI}
  500. {$ELSE}
  501. function MsiSetExternalUI(puiHandler: INSTALLUI_HANDLERA; dwMessageFilter: DWORD;
  502.   pvContext: LPVOID): INSTALLUI_HANDLERA; stdcall;
  503. {$EXTERNALSYM MsiSetExternalUI}
  504. {$ENDIF}
  505. // Enable logging to a file for all install sessions for the client process,
  506. // with control over which log messages are passed to the specified log file.
  507. // Messages are designated with a combination of bits from INSTALLLOGMODE enum.
  508. function MsiEnableLogA(dwLogMode: DWORD; szLogFile: LPCSTR; dwLogAttributes: DWORD): UINT; stdcall;
  509. {$EXTERNALSYM MsiEnableLogA}
  510. function MsiEnableLogW(dwLogMode: DWORD; szLogFile: LPCWSTR; dwLogAttributes: DWORD): UINT; stdcall;
  511. {$EXTERNALSYM MsiEnableLogW}
  512. {$IFDEF UNICODE}
  513. function MsiEnableLog(dwLogMode: DWORD; szLogFile: LPCWSTR; dwLogAttributes: DWORD): UINT; stdcall;
  514. {$EXTERNALSYM MsiEnableLog}
  515. {$ELSE}
  516. function MsiEnableLog(dwLogMode: DWORD; szLogFile: LPCSTR; dwLogAttributes: DWORD): UINT; stdcall;
  517. {$EXTERNALSYM MsiEnableLog}
  518. {$ENDIF}
  519. // --------------------------------------------------------------------------
  520. // Functions to query and configure a product as a whole.
  521. // --------------------------------------------------------------------------
  522. // Return the installed state for a product
  523. function MsiQueryProductStateA(szProduct: LPCSTR): INSTALLSTATE; stdcall;
  524. {$EXTERNALSYM MsiQueryProductStateA}
  525. function MsiQueryProductStateW(szProduct: LPCWSTR): INSTALLSTATE; stdcall;
  526. {$EXTERNALSYM MsiQueryProductStateW}
  527. {$IFDEF UNICODE}
  528. function MsiQueryProductState(szProduct: LPCWSTR): INSTALLSTATE; stdcall;
  529. {$EXTERNALSYM MsiQueryProductState}
  530. {$ELSE}
  531. function MsiQueryProductState(szProduct: LPCSTR): INSTALLSTATE; stdcall;
  532. {$EXTERNALSYM MsiQueryProductState}
  533. {$ENDIF}
  534. // Return product info
  535. function MsiGetProductInfoA(szProduct: LPCSTR; szAttribute: LPCSTR;
  536.   lpValueBuf: LPSTR; pcchValueBuf: LPDWORD): UINT; stdcall;
  537. {$EXTERNALSYM MsiGetProductInfoA}
  538. function MsiGetProductInfoW(szProduct: LPCWSTR; szAttribute: LPCWSTR;
  539.   lpValueBuf: LPWSTR; pcchValueBuf: LPDWORD): UINT; stdcall;
  540. {$EXTERNALSYM MsiGetProductInfoW}
  541. {$IFDEF UNICODE}
  542. function MsiGetProductInfo(szProduct: LPCWSTR; szAttribute: LPCWSTR;
  543.   lpValueBuf: LPWSTR; pcchValueBuf: LPDWORD): UINT; stdcall;
  544. {$EXTERNALSYM MsiGetProductInfo}
  545. {$ELSE}
  546. function MsiGetProductInfo(szProduct: LPCSTR; szAttribute: LPCSTR;
  547.   lpValueBuf: LPSTR; pcchValueBuf: LPDWORD): UINT; stdcall;
  548. {$EXTERNALSYM MsiGetProductInfo}
  549. {$ENDIF}
  550. // Install a new product.
  551. // Either may be NULL, but the DATABASE property must be specfied
  552. function MsiInstallProductA(szPackagePath: LPCSTR; szCommandLine: LPCSTR): UINT; stdcall;
  553. {$EXTERNALSYM MsiInstallProductA}
  554. function MsiInstallProductW(szPackagePath: LPCWSTR; szCommandLine: LPCWSTR): UINT; stdcall;
  555. {$EXTERNALSYM MsiInstallProductW}
  556. {$IFDEF UNICODE}
  557. function MsiInstallProduct(szPackagePath: LPCWSTR; szCommandLine: LPCWSTR): UINT; stdcall;
  558. {$EXTERNALSYM MsiInstallProduct}
  559. {$ELSE}
  560. function MsiInstallProduct(szPackagePath: LPCSTR; szCommandLine: LPCSTR): UINT; stdcall;
  561. {$EXTERNALSYM MsiInstallProduct}
  562. {$ENDIF}
  563. // Install/uninstall an advertised or installed product
  564. // No action if installed and INSTALLSTATE_DEFAULT specified
  565. function MsiConfigureProductA(szProduct: LPCSTR; iInstallLevel: Integer;
  566.   eInstallState: INSTALLSTATE): UINT; stdcall;
  567. {$EXTERNALSYM MsiConfigureProductA}
  568. function MsiConfigureProductW(szProduct: LPCWSTR; iInstallLevel: Integer;
  569.   eInstallState: INSTALLSTATE): UINT; stdcall;
  570. {$EXTERNALSYM MsiConfigureProductW}
  571. {$IFDEF UNICODE}
  572. function MsiConfigureProduct(szProduct: LPCWSTR; iInstallLevel: Integer;
  573.   eInstallState: INSTALLSTATE): UINT; stdcall;
  574. {$EXTERNALSYM MsiConfigureProduct}
  575. {$ELSE}
  576. function MsiConfigureProduct(szProduct: LPCSTR; iInstallLevel: Integer;
  577.   eInstallState: INSTALLSTATE): UINT; stdcall;
  578. {$EXTERNALSYM MsiConfigureProduct}
  579. {$ENDIF}
  580. // Install/uninstall an advertised or installed product
  581. // No action if installed and INSTALLSTATE_DEFAULT specified
  582. function MsiConfigureProductExA(szProduct: LPCSTR; iInstallLevel: Integer;
  583.   eInstallState: INSTALLSTATE; szCommandLine: LPCSTR): UINT; stdcall;
  584. {$EXTERNALSYM MsiConfigureProductExA}
  585. function MsiConfigureProductExW(szProduct: LPCWSTR; iInstallLevel: Integer;
  586.   eInstallState: INSTALLSTATE; szCommandLine: LPCWSTR): UINT; stdcall;
  587. {$EXTERNALSYM MsiConfigureProductExW}
  588. {$IFDEF UNICODE}
  589. function MsiConfigureProductEx(szProduct: LPCWSTR; iInstallLevel: Integer;
  590.   eInstallState: INSTALLSTATE; szCommandLine: LPCWSTR): UINT; stdcall;
  591. {$EXTERNALSYM MsiConfigureProductEx}
  592. {$ELSE}
  593. function MsiConfigureProductEx(szProduct: LPCSTR; iInstallLevel: Integer;
  594.   eInstallState: INSTALLSTATE; szCommandLine: LPCSTR): UINT; stdcall;
  595. {$EXTERNALSYM MsiConfigureProductEx}
  596. {$ENDIF}
  597. // Reinstall product, used to validate or correct problems
  598. function MsiReinstallProductA(szProduct: LPCSTR; szReinstallMode: DWORD): UINT; stdcall;
  599. {$EXTERNALSYM MsiReinstallProductA}
  600. function MsiReinstallProductW(szProduct: LPCWSTR; szReinstallMode: DWORD): UINT; stdcall;
  601. {$EXTERNALSYM MsiReinstallProductW}
  602. {$IFDEF UNICODE}
  603. function MsiReinstallProduct(szProduct: LPCWSTR; szReinstallMode: DWORD): UINT; stdcall;
  604. {$EXTERNALSYM MsiReinstallProduct}
  605. {$ELSE}
  606. function MsiReinstallProduct(szProduct: LPCSTR; szReinstallMode: DWORD): UINT; stdcall;
  607. {$EXTERNALSYM MsiReinstallProduct}
  608. {$ENDIF}
  609. // Output reg and shortcut info to script file for specified architecture for Assign or Publish
  610. // If dwPlatform is 0, then the script is created based on the current platform (behavior of MsiAdvertiseProduct)
  611. // If dwOptions includes MSIADVERTISEOPTIONFLAGS_INSTANCE, then a new instance is advertised. Use of
  612. //    this option requires that szTransforms include the instance transform that changes the product code
  613. function MsiAdvertiseProductExA(szPackagePath, szScriptfilePath, szTransforms: LPCSTR; lgidLanguage: LANGID;
  614.   dwPlatform, dwOptions: DWORD): UINT; stdcall;
  615. {$EXTERNALSYM MsiAdvertiseProductExA}
  616. function MsiAdvertiseProductExW(szPackagePath, szScriptfilePath, szTransforms: LPCWSTR; lgidLanguage: LANGID;
  617.   dwPlatform, dwOptions: DWORD): UINT; stdcall;
  618. {$EXTERNALSYM MsiAdvertiseProductExW}
  619. {$IFDEF UNICODE}
  620. function MsiAdvertiseProductEx(szPackagePath, szScriptfilePath, szTransforms: LPCWSTR; lgidLanguage: LANGID;
  621.   dwPlatform, dwOptions: DWORD): UINT; stdcall;
  622. {$EXTERNALSYM MsiAdvertiseProductEx}
  623. {$ELSE}
  624. function MsiAdvertiseProductEx(szPackagePath, szScriptfilePath, szTransforms: LPCSTR; lgidLanguage: LANGID;
  625.   dwPlatform, dwOptions: DWORD): UINT; stdcall;
  626. {$EXTERNALSYM MsiAdvertiseProductEx}
  627. {$ENDIF}
  628. // Output reg and shortcut info to script file for Assign or Publish
  629. function MsiAdvertiseProductA(szPackagePath, szScriptfilePath, szTransforms: LPCSTR; lgidLanguage: LANGID): UINT; stdcall;
  630. {$EXTERNALSYM MsiAdvertiseProductA}
  631. function MsiAdvertiseProductW(szPackagePath, szScriptfilePath, szTransforms: LPCWSTR; lgidLanguage: LANGID): UINT; stdcall;
  632. {$EXTERNALSYM MsiAdvertiseProductW}
  633. {$IFDEF UNICODE}
  634. function MsiAdvertiseProduct(szPackagePath, szScriptfilePath, szTransforms: LPCWSTR; lgidLanguage: LANGID): UINT; stdcall;
  635. {$EXTERNALSYM MsiAdvertiseProduct}
  636. {$ELSE}
  637. function MsiAdvertiseProduct(szPackagePath, szScriptfilePath, szTransforms: LPCSTR; lgidLanguage: LANGID): UINT; stdcall;
  638. {$EXTERNALSYM MsiAdvertiseProduct}
  639. {$ENDIF}
  640. // Process advertise script file into supplied locations
  641. // If an icon folder is specified, icon files will be placed there
  642. // If an registry key is specified, registry data will be mapped under it
  643. // If fShortcuts is TRUE, shortcuts will be created. If a special folder is
  644. //    returned by SHGetSpecialFolderLocation(?), it will hold the shortcuts.
  645. // if fRemoveItems is TRUE, items that are present will be removed
  646. function MsiProcessAdvertiseScriptA(szScriptFile, szIconFolder: LPCSTR; hRegData: HKEY; fShortcuts, fRemoveItems: BOOL): UINT; stdcall;
  647. {$EXTERNALSYM MsiProcessAdvertiseScriptA}
  648. function MsiProcessAdvertiseScriptW(szScriptFile, szIconFolder: LPCWSTR; hRegData: HKEY; fShortcuts, fRemoveItems: BOOL): UINT; stdcall;
  649. {$EXTERNALSYM MsiProcessAdvertiseScriptW}
  650. {$IFDEF UNICODE}
  651. function MsiProcessAdvertiseScript(szScriptFile, szIconFolder: LPCWSTR; hRegData: HKEY; fShortcuts, fRemoveItems: BOOL): UINT; stdcall;
  652. {$EXTERNALSYM MsiProcessAdvertiseScript}
  653. {$ELSE}
  654. function MsiProcessAdvertiseScript(szScriptFile, szIconFolder: LPCSTR; hRegData: HKEY; fShortcuts, fRemoveItems: BOOL): UINT; stdcall;
  655. {$EXTERNALSYM MsiProcessAdvertiseScript}
  656. {$ENDIF}
  657. // Process advertise script file using the supplied dwFlags control flags
  658. // if fRemoveItems is TRUE, items that are present will be removed
  659. function MsiAdvertiseScriptA(szScriptFile: LPCSTR; dwFlags: DWORD; phRegData: PHKEY; fRemoveItems: BOOL): UINT; stdcall;
  660. {$EXTERNALSYM MsiAdvertiseScriptA}
  661. function MsiAdvertiseScriptW(szScriptFile: LPCWSTR; dwFlags: DWORD; phRegData: PHKEY; fRemoveItems: BOOL): UINT; stdcall;
  662. {$EXTERNALSYM MsiAdvertiseScriptW}
  663. {$IFDEF UNICODE}
  664. function MsiAdvertiseScript(szScriptFile: LPCWSTR; dwFlags: DWORD; phRegData: PHKEY; fRemoveItems: BOOL): UINT; stdcall;
  665. {$EXTERNALSYM MsiAdvertiseScript}
  666. {$ELSE}
  667. function MsiAdvertiseScript(szScriptFile: LPCSTR; dwFlags: DWORD; phRegData: PHKEY; fRemoveItems: BOOL): UINT; stdcall;
  668. {$EXTERNALSYM MsiAdvertiseScript}
  669. {$ENDIF}
  670. // Return product info from an installer script file:
  671. //   product code, language, version, readable name, path to package
  672. // Returns TRUE is success, FALSE if szScriptFile is not a valid script file
  673. function MsiGetProductInfoFromScriptA(szScriptFile: LPCSTR; lpProductBuf39: LPSTR; plgidLanguage: PLANGID; pdwVersion: LPDWORD;
  674.   lpNameBuf: LPSTR; pcchNameBuf: LPDWORD; lpPackageBuf: LPSTR; pcchPackageBuf: LPDWORD): UINT; stdcall;
  675. {$EXTERNALSYM MsiGetProductInfoFromScriptA}
  676. function MsiGetProductInfoFromScriptW(szScriptFile: LPCWSTR; lpProductBuf39: LPWSTR; plgidLanguage: PLANGID; pdwVersion: LPDWORD;
  677.   lpNameBuf: LPWSTR; pcchNameBuf: LPDWORD; lpPackageBuf: LPWSTR; pcchPackageBuf: LPDWORD): UINT; stdcall;
  678. {$EXTERNALSYM MsiGetProductInfoFromScriptW}
  679. {$IFDEF UNICODE}
  680. function MsiGetProductInfoFromScript(szScriptFile: LPCWSTR; lpProductBuf39: LPWSTR; plgidLanguage: PLANGID; pdwVersion: LPDWORD;
  681.   lpNameBuf: LPWSTR; pcchNameBuf: LPDWORD; lpPackageBuf: LPWSTR; pcchPackageBuf: LPDWORD): UINT; stdcall;
  682. {$EXTERNALSYM MsiGetProductInfoFromScript}
  683. {$ELSE}
  684. function MsiGetProductInfoFromScript(szScriptFile: LPCSTR; lpProductBuf39: LPSTR; plgidLanguage: PLANGID; pdwVersion: LPDWORD;
  685.   lpNameBuf: LPSTR; pcchNameBuf: LPDWORD; lpPackageBuf: LPSTR; pcchPackageBuf: LPDWORD): UINT; stdcall;
  686. {$EXTERNALSYM MsiGetProductInfoFromScript}
  687. {$ENDIF}
  688. // Return the product code for a registered component, called once by apps
  689. function MsiGetProductCodeA(szComponent: LPCSTR; lpBuf39: LPSTR): UINT; stdcall;
  690. {$EXTERNALSYM MsiGetProductCodeA}
  691. function MsiGetProductCodeW(szComponent: LPCWSTR; lpBuf39: LPWSTR): UINT; stdcall;
  692. {$EXTERNALSYM MsiGetProductCodeW}
  693. {$IFDEF UNICODE}
  694. function MsiGetProductCode(szComponent: LPCWSTR; lpBuf39: LPWSTR): UINT; stdcall;
  695. {$EXTERNALSYM MsiGetProductCode}
  696. {$ELSE}
  697. function MsiGetProductCode(szComponent: LPCSTR; lpBuf39: LPSTR): UINT; stdcall;
  698. {$EXTERNALSYM MsiGetProductCode}
  699. {$ENDIF}
  700. // Return the registered user information for an installed product
  701. function MsiGetUserInfoA(szProduct: LPCSTR; lpUserNameBuf: LPSTR;
  702.   var pcchUserNameBuf: DWORD; lpOrgNameBuf: LPSTR; var pcchOrgNameBuf: DWORD;
  703.   lpSerialBuf: LPSTR; var pcchSerialBuf: DWORD): USERINFOSTATE; stdcall;
  704. {$EXTERNALSYM MsiGetUserInfoA}
  705. function MsiGetUserInfoW(szProduct: LPCWSTR; lpUserNameBuf: LPWSTR;
  706.   var pcchUserNameBuf: DWORD; lpOrgNameBuf: LPWSTR; var pcchOrgNameBuf: DWORD;
  707.   lpSerialBuf: LPWSTR; var pcchSerialBuf: DWORD): USERINFOSTATE; stdcall;
  708. {$EXTERNALSYM MsiGetUserInfoW}
  709. {$IFDEF UNICODE}
  710. function MsiGetUserInfo(szProduct: LPCWSTR; lpUserNameBuf: LPWSTR;
  711.   var pcchUserNameBuf: DWORD; lpOrgNameBuf: LPWSTR; var pcchOrgNameBuf: DWORD;
  712.   lpSerialBuf: LPWSTR; var pcchSerialBuf: DWORD): USERINFOSTATE; stdcall;
  713. {$EXTERNALSYM MsiGetUserInfo}
  714. {$ELSE}
  715. function MsiGetUserInfo(szProduct: LPCSTR; lpUserNameBuf: LPSTR;
  716.   var pcchUserNameBuf: DWORD; lpOrgNameBuf: LPSTR; var pcchOrgNameBuf: DWORD;
  717.   lpSerialBuf: LPSTR; var pcchSerialBuf: DWORD): USERINFOSTATE; stdcall;
  718. {$EXTERNALSYM MsiGetUserInfo}
  719. {$ENDIF}
  720. // Obtain and store user info and PID from installation wizard (first run)
  721. function MsiCollectUserInfoA(szProduct: LPCSTR): UINT; stdcall;
  722. {$EXTERNALSYM MsiCollectUserInfoA}
  723. function MsiCollectUserInfoW(szProduct: LPCWSTR): UINT; stdcall;
  724. {$EXTERNALSYM MsiCollectUserInfoW}
  725. {$IFDEF UNICODE}
  726. function MsiCollectUserInfo(szProduct: LPCWSTR): UINT; stdcall;
  727. {$EXTERNALSYM MsiCollectUserInfo}
  728. {$ELSE}
  729. function MsiCollectUserInfo(szProduct: LPCSTR): UINT; stdcall;
  730. {$EXTERNALSYM MsiCollectUserInfo}
  731. {$ENDIF}
  732. // --------------------------------------------------------------------------
  733. // Functions to patch existing products
  734. // --------------------------------------------------------------------------
  735. // Patch all possible installed products.
  736. function MsiApplyPatchA(szPatchPackage: LPCSTR; szInstallPackage: LPCSTR;
  737.   eInstallType: INSTALLTYPE; szCommandLine: LPCSTR): UINT; stdcall;
  738. {$EXTERNALSYM MsiApplyPatchA}
  739. function MsiApplyPatchW(szPatchPackage: LPCWSTR; szInstallPackage: LPCWSTR;
  740.   eInstallType: INSTALLTYPE; szCommandLine: LPCWSTR): UINT; stdcall;
  741. {$EXTERNALSYM MsiApplyPatchW}
  742. {$IFDEF UNICODE}
  743. function MsiApplyPatch(szPatchPackage: LPCWSTR; szInstallPackage: LPCWSTR;
  744.   eInstallType: INSTALLTYPE; szCommandLine: LPCWSTR): UINT; stdcall;
  745. {$EXTERNALSYM MsiApplyPatch}
  746. {$ELSE}
  747. function MsiApplyPatch(szPatchPackage: LPCSTR; szInstallPackage: LPCSTR;
  748.   eInstallType: INSTALLTYPE; szCommandLine: LPCSTR): UINT; stdcall;
  749. {$EXTERNALSYM MsiApplyPatch}
  750. {$ENDIF}
  751. // Return patch info
  752. function MsiGetPatchInfoA(szPatch: LPCSTR; szAttribute: LPCSTR;
  753.   lpValueBuf: LPSTR; pcchValueBuf: LPDWORD): UINT; stdcall;
  754. {$EXTERNALSYM MsiGetPatchInfoA}
  755. function MsiGetPatchInfoW(szPatch: LPCWSTR; szAttribute: LPCWSTR;
  756.   lpValueBuf: LPWSTR; pcchValueBuf: LPDWORD): UINT; stdcall;
  757. {$EXTERNALSYM MsiGetPatchInfoW}
  758. {$IFDEF UNICODE}
  759. function MsiGetPatchInfo(szPatch: LPCWSTR; szAttribute: LPCWSTR;
  760.   lpValueBuf: LPWSTR; pcchValueBuf: LPDWORD): UINT; stdcall;
  761. {$EXTERNALSYM MsiGetPatchInfo}
  762. {$ELSE}
  763. function MsiGetPatchInfo(szPatch: LPCSTR; szAttribute: LPCSTR;
  764.   lpValueBuf: LPSTR; pcchValueBuf: LPDWORD): UINT; stdcall;
  765. {$EXTERNALSYM MsiGetPatchInfo}
  766. {$ENDIF}
  767. // Enumerate all patches for a product
  768. function MsiEnumPatchesA(szProduct: LPCSTR; iPatchIndex: DWORD; lpPatchBuf: LPSTR;
  769.   lpTransformsBuf: LPSTR; var pcchTransformsBuf: DWORD): UINT; stdcall;
  770. {$EXTERNALSYM MsiEnumPatchesA}
  771. function MsiEnumPatchesW(szProduct: LPCWSTR; iPatchIndex: DWORD; lpPatchBuf: LPWSTR;
  772.   lpTransformsBuf: LPWSTR; var pcchTransformsBuf: DWORD): UINT; stdcall;
  773. {$EXTERNALSYM MsiEnumPatchesW}
  774. {$IFDEF UNICODE}
  775. function MsiEnumPatches(szProduct: LPCWSTR; iPatchIndex: DWORD; lpPatchBuf: LPWSTR;
  776.   lpTransformsBuf: LPWSTR; var pcchTransformsBuf: DWORD): UINT; stdcall;
  777. {$EXTERNALSYM MsiEnumPatches}
  778. {$ELSE}
  779. function MsiEnumPatches(szProduct: LPCSTR; iPatchIndex: DWORD; lpPatchBuf: LPSTR;
  780.   lpTransformsBuf: LPSTR; var pcchTransformsBuf: DWORD): UINT; stdcall;
  781. {$EXTERNALSYM MsiEnumPatches}
  782. {$ENDIF}
  783. // --------------------------------------------------------------------------
  784. // Functions to query and configure a feature within a product.
  785. // --------------------------------------------------------------------------
  786. // Return the installed state for a product feature
  787. function MsiQueryFeatureStateA(szProduct: LPCSTR; szFeature: LPCSTR): INSTALLSTATE; stdcall;
  788. {$EXTERNALSYM MsiQueryFeatureStateA}
  789. function MsiQueryFeatureStateW(szProduct: LPCWSTR; szFeature: LPCWSTR): INSTALLSTATE; stdcall;
  790. {$EXTERNALSYM MsiQueryFeatureStateW}
  791. {$IFDEF UNICODE}
  792. function MsiQueryFeatureState(szProduct: LPCWSTR; szFeature: LPCWSTR): INSTALLSTATE; stdcall;
  793. {$EXTERNALSYM MsiQueryFeatureState}
  794. {$ELSE}
  795. function MsiQueryFeatureState(szProduct: LPCSTR; szFeature: LPCSTR): INSTALLSTATE; stdcall;
  796. {$EXTERNALSYM MsiQueryFeatureState}
  797. {$ENDIF}
  798. // Indicate intent to use a product feature, increments usage count
  799. // Prompts for CD if not loaded, does not install feature
  800. function MsiUseFeatureA(szProduct: LPCSTR; szFeature: LPCSTR): INSTALLSTATE; stdcall;
  801. {$EXTERNALSYM MsiUseFeatureA}
  802. function MsiUseFeatureW(szProduct: LPCWSTR; szFeature: LPCWSTR): INSTALLSTATE; stdcall;
  803. {$EXTERNALSYM MsiUseFeatureW}
  804. {$IFDEF UNICODE}
  805. function MsiUseFeature(szProduct: LPCWSTR; szFeature: LPCWSTR): INSTALLSTATE; stdcall;
  806. {$EXTERNALSYM MsiUseFeature}
  807. {$ELSE}
  808. function MsiUseFeature(szProduct: LPCSTR; szFeature: LPCSTR): INSTALLSTATE; stdcall;
  809. {$EXTERNALSYM MsiUseFeature}
  810. {$ENDIF}
  811. // Indicate intent to use a product feature, increments usage count
  812. // Prompts for CD if not loaded, does not install feature
  813. // Allows for bypassing component detection where performance is critical
  814. function MsiUseFeatureExA(szProduct: LPCSTR; szFeature: LPCSTR;
  815.   dwInstallMode: DWORD; dwReserved: DWORD): INSTALLSTATE; stdcall;
  816. {$EXTERNALSYM MsiUseFeatureExA}
  817. function MsiUseFeatureExW(szProduct: LPCWSTR; szFeature: LPCWSTR; dwInstallMode: DWORD;
  818.   dwReserved: DWORD): INSTALLSTATE; stdcall;
  819. {$EXTERNALSYM MsiUseFeatureExW}
  820. {$IFDEF UNICODE}
  821. function MsiUseFeatureEx(szProduct: LPCWSTR; szFeature: LPCWSTR;
  822.   dwInstallMode: DWORD; dwReserved: DWORD): INSTALLSTATE; stdcall;
  823. {$EXTERNALSYM MsiUseFeatureEx}
  824. {$ELSE}
  825. function MsiUseFeatureEx(szProduct: LPCSTR; szFeature: LPCSTR;
  826.   dwInstallMode: DWORD; dwReserved: DWORD): INSTALLSTATE; stdcall;
  827. {$EXTERNALSYM MsiUseFeatureEx}
  828. {$ENDIF}
  829. // Return the usage metrics for a product feature
  830. function MsiGetFeatureUsageA(szProduct: LPCSTR; szFeature: LPCSTR;
  831.   var pdwUseCount, pwDateUsed: WORD): UINT; stdcall;
  832. {$EXTERNALSYM MsiGetFeatureUsageA}
  833. function MsiGetFeatureUsageW(szProduct: LPCWSTR; szFeature: LPCWSTR;
  834.   var pdwUseCount, pwDateUsed: WORD): UINT; stdcall;
  835. {$EXTERNALSYM MsiGetFeatureUsageW}
  836. {$IFDEF UNICODE}
  837. function MsiGetFeatureUsage(szProduct: LPCWSTR; szFeature: LPCWSTR;
  838.   var pdwUseCount, pwDateUsed: WORD): UINT; stdcall;
  839. {$EXTERNALSYM MsiGetFeatureUsage}
  840. {$ELSE}
  841. function MsiGetFeatureUsage(szProduct: LPCSTR; szFeature: LPCSTR;
  842.   var pdwUseCount, pwDateUsed: WORD): UINT; stdcall;
  843. {$EXTERNALSYM MsiGetFeatureUsage}
  844. {$ENDIF}
  845. // Force the installed state for a product feature
  846. function MsiConfigureFeatureA(szProduct, szFeature: LPCSTR; eInstallState: INSTALLSTATE): UINT; stdcall;
  847. {$EXTERNALSYM MsiConfigureFeatureA}
  848. function MsiConfigureFeatureW(szProduct, szFeature: LPCWSTR; eInstallState: INSTALLSTATE): UINT; stdcall;
  849. {$EXTERNALSYM MsiConfigureFeatureW}
  850. {$IFDEF UNICODE}
  851. function MsiConfigureFeature(szProduct, szFeature: LPCWSTR; eInstallState: INSTALLSTATE): UINT; stdcall;
  852. {$EXTERNALSYM MsiConfigureFeature}
  853. {$ELSE}
  854. function MsiConfigureFeature(szProduct, szFeature: LPCSTR; eInstallState: INSTALLSTATE): UINT; stdcall;
  855. {$EXTERNALSYM MsiConfigureFeature}
  856. {$ENDIF}
  857. // Reinstall feature, used to validate or correct problems
  858. function MsiReinstallFeatureA(szProduct, szFeature: LPCSTR; dwReinstallMode: DWORD): UINT; stdcall;
  859. {$EXTERNALSYM MsiReinstallFeatureA}
  860. function MsiReinstallFeatureW(szProduct, szFeature: LPCWSTR; dwReinstallMode: DWORD): UINT; stdcall;
  861. {$EXTERNALSYM MsiReinstallFeatureW}
  862. {$IFDEF UNICODE}
  863. function MsiReinstallFeature(szProduct, szFeature: LPCWSTR; dwReinstallMode: DWORD): UINT; stdcall;
  864. {$EXTERNALSYM MsiReinstallFeature}
  865. {$ELSE}
  866. function MsiReinstallFeature(szProduct, szFeature: LPCSTR; dwReinstallMode: DWORD): UINT; stdcall;
  867. {$EXTERNALSYM MsiReinstallFeature}
  868. {$ENDIF}
  869. // --------------------------------------------------------------------------
  870. // Functions to return a path to a particular component.
  871. // The state of the feature being used should have been checked previously.
  872. // --------------------------------------------------------------------------
  873. // Return full component path, performing any necessary installation
  874. // calls MsiQueryFeatureState to detect that all components are installed
  875. // then calls MsiConfigureFeature if any of its components are uninstalled
  876. // then calls MsiLocateComponent to obtain the path the its key file
  877. function MsiProvideComponentA(szProduct: LPCSTR; szFeature: LPCSTR; szComponent: LPCSTR;
  878.   dwInstallMode: DWORD; lpPathBuf: LPSTR; pcchPathBuf: LPDWORD): UINT; stdcall;
  879. {$EXTERNALSYM MsiProvideComponentA}
  880. function MsiProvideComponentW(szProduct: LPCWSTR; szFeature: LPCWSTR; szComponent: LPCWSTR;
  881.   dwInstallMode: DWORD; lpPathBuf: LPWSTR; pcchPathBuf: LPDWORD): UINT; stdcall;
  882. {$EXTERNALSYM MsiProvideComponentW}
  883. {$IFDEF UNICODE}
  884. function MsiProvideComponent(szProduct: LPCWSTR; szFeature: LPCWSTR; szComponent: LPCWSTR;
  885.   dwInstallMode: DWORD; lpPathBuf: LPWSTR; pcchPathBuf: LPDWORD): UINT; stdcall;
  886. {$EXTERNALSYM MsiProvideComponent}
  887. {$ELSE}
  888. function MsiProvideComponent(szProduct: LPCSTR; szFeature: LPCSTR; szComponent: LPCSTR;
  889.   dwInstallMode: DWORD; lpPathBuf: LPSTR; pcchPathBuf: LPDWORD): UINT; stdcall;
  890. {$EXTERNALSYM MsiProvideComponent}
  891. {$ENDIF}
  892. // Return full component path for a qualified component, performing any necessary installation.
  893. // Prompts for source if necessary and increments the usage count for the feature.
  894. function MsiProvideQualifiedComponentA(szCategory: LPCSTR; szQualifier: LPCSTR;
  895.   dwInstallMode: DWORD; lpPathBuf: LPSTR; pcchPathBuf: LPDWORD): UINT; stdcall;
  896. {$EXTERNALSYM MsiProvideQualifiedComponentA}
  897. function MsiProvideQualifiedComponentW(szCategory: LPCWSTR; szQualifier: LPCWSTR;
  898.   dwInstallMode: DWORD; lpPathBuf: LPWSTR; pcchPathBuf: LPDWORD): UINT; stdcall;
  899. {$EXTERNALSYM MsiProvideQualifiedComponentW}
  900. {$IFDEF UNICODE}
  901. function MsiProvideQualifiedComponent(szCategory: LPCWSTR; szQualifier: LPCWSTR;
  902.   dwInstallMode: DWORD; lpPathBuf: LPWSTR; pcchPathBuf: LPDWORD): UINT; stdcall;
  903. {$EXTERNALSYM MsiProvideQualifiedComponent}
  904. {$ELSE}
  905. function MsiProvideQualifiedComponent(szCategory: LPCSTR; szQualifier: LPCSTR;
  906.   dwInstallMode: DWORD; lpPathBuf: LPSTR; pcchPathBuf: LPDWORD): UINT; stdcall;
  907. {$EXTERNALSYM MsiProvideQualifiedComponent}
  908. {$ENDIF}
  909. // Return full component path for a qualified component, performing any necessary installation.
  910. // Prompts for source if necessary and increments the usage count for the feature.
  911. // The szProduct parameter specifies the product to match that has published the qualified
  912. // component. If null, this API works the same as MsiProvideQualifiedComponent.
  913. function MsiProvideQualifiedComponentExA(szCategory: LPCSTR; szQualifier: LPCSTR;
  914.   dwInstallMode: DWORD; szProduct: LPCSTR; dwUnused1: DWORD; dwUnused2: DWORD;
  915.   lpPathBuf: LPSTR; pcchPathBuf: LPDWORD): UINT; stdcall;
  916. {$EXTERNALSYM MsiProvideQualifiedComponentExA}
  917. function MsiProvideQualifiedComponentExW(szCategory: LPCWSTR; szQualifier: LPCWSTR;
  918.   dwInstallMode: DWORD; szProduct: LPCWSTR; dwUnused1: DWORD; dwUnused2: DWORD;
  919.   lpPathBuf: LPWSTR; pcchPathBuf: LPDWORD): UINT; stdcall;
  920. {$EXTERNALSYM MsiProvideQualifiedComponentExW}
  921. {$IFDEF UNICODE}
  922. function MsiProvideQualifiedComponentEx(szCategory: LPCWSTR; szQualifier: LPCWSTR;
  923.   dwInstallMode: DWORD; szProduct: LPCWSTR; dwUnused1: DWORD; dwUnused2: DWORD;
  924.   lpPathBuf: LPWSTR; pcchPathBuf: LPDWORD): UINT; stdcall;
  925. {$EXTERNALSYM MsiProvideQualifiedComponentEx}
  926. {$ELSE}
  927. function MsiProvideQualifiedComponentEx(szCategory: LPCSTR; szQualifier: LPCSTR;
  928.   dwInstallMode: DWORD; szProduct: LPCSTR; dwUnused1: DWORD; dwUnused2: DWORD;
  929.   lpPathBuf: LPSTR; pcchPathBuf: LPDWORD): UINT; stdcall;
  930. {$EXTERNALSYM MsiProvideQualifiedComponentEx}
  931. {$ENDIF}
  932. // Return full path to an installed component
  933. function MsiGetComponentPathA(szProduct: LPCSTR; szComponent: LPCSTR;
  934.   lpPathBuf: LPSTR; pcchBuf: LPDWORD): INSTALLSTATE; stdcall;
  935. {$EXTERNALSYM MsiGetComponentPathA}
  936. function MsiGetComponentPathW(szProduct: LPCWSTR; szComponent: LPCWSTR;
  937.   lpPathBuf: LPWSTR; pcchBuf: LPDWORD): INSTALLSTATE; stdcall;
  938. {$EXTERNALSYM MsiGetComponentPathW}
  939. {$IFDEF UNICODE}
  940. function MsiGetComponentPath(szProduct: LPCWSTR; szComponent: LPCWSTR;
  941.   lpPathBuf: LPWSTR; pcchBuf: LPDWORD): INSTALLSTATE; stdcall;
  942. {$EXTERNALSYM MsiGetComponentPath}
  943. {$ELSE}
  944. function MsiGetComponentPath(szProduct: LPCSTR; szComponent: LPCSTR;
  945.   lpPathBuf: LPSTR; pcchBuf: LPDWORD): INSTALLSTATE; stdcall;
  946. {$EXTERNALSYM MsiGetComponentPath}
  947. {$ENDIF}
  948. const
  949.   MSIASSEMBLYINFO_NETASSEMBLY   = 0; // Net assemblies
  950.   {$EXTERNALSYM MSIASSEMBLYINFO_NETASSEMBLY}
  951.   MSIASSEMBLYINFO_WIN32ASSEMBLY = 1; // Win32 assemblies
  952.   {$EXTERNALSYM MSIASSEMBLYINFO_WIN32ASSEMBLY}
  953. // Return full component path for an assembly installed via the WI, performing any necessary installation.
  954. // Prompts for source if necessary and increments the usage count for the feature.
  955. // The szAssemblyName parameter specifies the stringized assembly name.
  956. // The szAppContext is the full path to the .cfg file or the app exe to which the assembly being requested
  957. // has been privatised to, which is null for global assemblies
  958. function MsiProvideAssemblyA(szAssemblyName, szAppContext: LPCSTR; dwInstallMode, dwAssemblyInfo: DWORD;
  959.   lpPathBuf: LPSTR; pcchPathBuf: LPDWORD): UINT; stdcall;
  960. {$EXTERNALSYM MsiProvideAssemblyA}
  961. function MsiProvideAssemblyW(szAssemblyName, szAppContext: LPCWSTR; dwInstallMode, dwAssemblyInfo: DWORD;
  962.   lpPathBuf: LPWSTR; pcchPathBuf: LPDWORD): UINT; stdcall;
  963. {$EXTERNALSYM MsiProvideAssemblyW}
  964. {$IFDEF UNICODE}
  965. function MsiProvideAssembly(szAssemblyName, szAppContext: LPCWSTR; dwInstallMode, dwAssemblyInfo: DWORD;
  966.   lpPathBuf: LPWSTR; pcchPathBuf: LPDWORD): UINT; stdcall;
  967. {$EXTERNALSYM MsiProvideAssembly}
  968. {$ELSE}
  969. function MsiProvideAssembly(szAssemblyName, szAppContext: LPCSTR; dwInstallMode, dwAssemblyInfo: DWORD;
  970.   lpPathBuf: LPSTR; pcchPathBuf: LPDWORD): UINT; stdcall;
  971. {$EXTERNALSYM MsiProvideAssembly}
  972. {$ENDIF}
  973. // --------------------------------------------------------------------------
  974. // Functions to iterate registered products, features, and components.
  975. // As with reg keys, they accept a 0-based index into the enumeration.
  976. // --------------------------------------------------------------------------
  977. // Enumerate the registered products, either installed or advertised
  978. function MsiEnumProductsA(iProductIndex: DWORD; lpProductBuf: LPSTR): UINT; stdcall;
  979. {$EXTERNALSYM MsiEnumProductsA}
  980. function MsiEnumProductsW(iProductIndex: DWORD; lpProductBuf: LPWSTR): UINT; stdcall;
  981. {$EXTERNALSYM MsiEnumProductsW}
  982. {$IFDEF UNICODE}
  983. function MsiEnumProducts(iProductIndex: DWORD; lpProductBuf: LPWSTR): UINT; stdcall;
  984. {$EXTERNALSYM MsiEnumProducts}
  985. {$ELSE}
  986. function MsiEnumProducts(iProductIndex: DWORD; lpProductBuf: LPSTR): UINT; stdcall;
  987. {$EXTERNALSYM MsiEnumProducts}
  988. {$ENDIF}
  989. {$IFDEF WIN32_MSI_110}
  990. // Enumerate products with given upgrade code
  991. function MsiEnumRelatedProductsA(lpUpgradeCode: LPCSTR; dwReserved: DWORD;
  992.   iProductIndex: DWORD; lpProductBuf: LPSTR): UINT; stdcall;
  993. {$EXTERNALSYM MsiEnumRelatedProductsA}
  994. function MsiEnumRelatedProductsW(lpUpgradeCode: LPCWSTR; dwReserved: DWORD;
  995.   iProductIndex: DWORD; lpProductBuf: LPWSTR): UINT; stdcall;
  996. {$EXTERNALSYM MsiEnumRelatedProductsW}
  997. {$IFDEF UNICODE}
  998. function MsiEnumRelatedProducts(lpUpgradeCode: LPCWSTR; dwReserved: DWORD;
  999.   iProductIndex: DWORD; lpProductBuf: LPWSTR): UINT; stdcall;
  1000. {$EXTERNALSYM MsiEnumRelatedProducts}
  1001. {$ELSE}
  1002. function MsiEnumRelatedProducts(lpUpgradeCode: LPCSTR; dwReserved: DWORD;
  1003.   iProductIndex: DWORD; lpProductBuf: LPSTR): UINT; stdcall;
  1004. {$EXTERNALSYM MsiEnumRelatedProducts}
  1005. {$ENDIF}
  1006. {$ENDIF WIN32_MSI_110}
  1007. // Enumerate the advertised features for a given product.
  1008. // If parent is not required, supplying NULL will improve performance.
  1009. function MsiEnumFeaturesA(szProduct: LPCSTR; iFeatureIndex: DWORD;
  1010.   lpFeatureBuf: LPSTR; lpParentBuf: LPSTR): UINT; stdcall;
  1011. {$EXTERNALSYM MsiEnumFeaturesA}
  1012. function MsiEnumFeaturesW(szProduct: LPCWSTR; iFeatureIndex: DWORD;
  1013.   lpFeatureBuf: LPWSTR; lpParentBuf: LPWSTR): UINT; stdcall;
  1014. {$EXTERNALSYM MsiEnumFeaturesW}
  1015. {$IFDEF UNICODE}
  1016. function MsiEnumFeatures(szProduct: LPCWSTR; iFeatureIndex: DWORD;
  1017.   lpFeatureBuf: LPWSTR; lpParentBuf: LPWSTR): UINT; stdcall;
  1018. {$EXTERNALSYM MsiEnumFeatures}
  1019. {$ELSE}
  1020. function MsiEnumFeatures(szProduct: LPCSTR; iFeatureIndex: DWORD;
  1021.   lpFeatureBuf: LPSTR; lpParentBuf: LPSTR): UINT; stdcall;
  1022. {$EXTERNALSYM MsiEnumFeatures}
  1023. {$ENDIF}
  1024. // Enumerate the installed components for all products
  1025. function MsiEnumComponentsA(iComponentIndex: DWORD; lpComponentBuf: LPSTR): UINT; stdcall;
  1026. {$EXTERNALSYM MsiEnumComponentsA}
  1027. function MsiEnumComponentsW(iComponentIndex: DWORD; lpComponentBuf: LPWSTR): UINT; stdcall;
  1028. {$EXTERNALSYM MsiEnumComponentsW}
  1029. {$IFDEF UNICODE}
  1030. function MsiEnumComponents(iComponentIndex: DWORD; lpComponentBuf: LPWSTR): UINT; stdcall;
  1031. {$EXTERNALSYM MsiEnumComponents}
  1032. {$ELSE}
  1033. function MsiEnumComponents(iComponentIndex: DWORD; lpComponentBuf: LPSTR): UINT; stdcall;
  1034. {$EXTERNALSYM MsiEnumComponents}
  1035. {$ENDIF}
  1036. // Enumerate the client products for a component
  1037. function MsiEnumClientsA(szComponent: LPCSTR; iProductIndex: DWORD; lpProductBuf: LPSTR): UINT; stdcall;
  1038. {$EXTERNALSYM MsiEnumClientsA}
  1039. function MsiEnumClientsW(szComponent: LPCWSTR; iProductIndex: DWORD; lpProductBuf: LPWSTR): UINT; stdcall;
  1040. {$EXTERNALSYM MsiEnumClientsW}
  1041. {$IFDEF UNICODE}
  1042. function MsiEnumClients(szComponent: LPCWSTR; iProductIndex: DWORD; lpProductBuf: LPWSTR): UINT; stdcall;
  1043. {$EXTERNALSYM MsiEnumClients}
  1044. {$ELSE}
  1045. function MsiEnumClients(szComponent: LPCSTR; iProductIndex: DWORD; lpProductBuf: LPSTR): UINT; stdcall;
  1046. {$EXTERNALSYM MsiEnumClients}
  1047. {$ENDIF}
  1048. // Enumerate the qualifiers for an advertised component.
  1049. function MsiEnumComponentQualifiersA(szComponent: LPCSTR; iIndex: DWORD;
  1050.   lpQualifierBuf: LPSTR; var pcchQualifierBuf: DWORD; lpApplicationDataBuf: LPSTR;
  1051.   pcchApplicationDataBuf: LPDWORD): UINT; stdcall;
  1052. {$EXTERNALSYM MsiEnumComponentQualifiersA}
  1053. function MsiEnumComponentQualifiersW(szComponent: LPCWSTR; iIndex: DWORD;
  1054.   lpQualifierBuf: LPWSTR; var pcchQualifierBuf: DWORD; lpApplicationDataBuf: LPWSTR;
  1055.   pcchApplicationDataBuf: LPDWORD): UINT; stdcall;
  1056. {$EXTERNALSYM MsiEnumComponentQualifiersW}
  1057. {$IFDEF UNICODE}
  1058. function MsiEnumComponentQualifiers(szComponent: LPCWSTR; iIndex: DWORD;
  1059.   lpQualifierBuf: LPWSTR; var pcchQualifierBuf: DWORD; lpApplicationDataBuf: LPWSTR;
  1060.   pcchApplicationDataBuf: LPDWORD): UINT; stdcall;
  1061. {$EXTERNALSYM MsiEnumComponentQualifiers}
  1062. {$ELSE}
  1063. function MsiEnumComponentQualifiers(szComponent: LPCSTR; iIndex: DWORD;
  1064.   lpQualifierBuf: LPSTR; var pcchQualifierBuf: DWORD; lpApplicationDataBuf: LPSTR;
  1065.   pcchApplicationDataBuf: LPDWORD): UINT; stdcall;
  1066. {$EXTERNALSYM MsiEnumComponentQualifiers}
  1067. {$ENDIF}
  1068. // --------------------------------------------------------------------------
  1069. // Functions to obtain product or package information.
  1070. // --------------------------------------------------------------------------
  1071. // Open the installation for a product to obtain detailed information
  1072. function MsiOpenProductA(szProduct: LPCSTR; var hProduct: MSIHANDLE): UINT; stdcall;
  1073. {$EXTERNALSYM MsiOpenProductA}
  1074. function MsiOpenProductW(szProduct: LPCWSTR; var hProduct: MSIHANDLE): UINT; stdcall;
  1075. {$EXTERNALSYM MsiOpenProductW}
  1076. {$IFDEF UNICODE}
  1077. function MsiOpenProduct(szProduct: LPCWSTR; var hProduct: MSIHANDLE): UINT; stdcall;
  1078. {$EXTERNALSYM MsiOpenProduct}
  1079. {$ELSE}
  1080. function MsiOpenProduct(szProduct: LPCSTR; var hProduct: MSIHANDLE): UINT; stdcall;
  1081. {$EXTERNALSYM MsiOpenProduct}
  1082. {$ENDIF}
  1083. // Open a product package in order to access product properties
  1084. function MsiOpenPackageA(szPackagePath: LPCSTR; var hProduct: MSIHANDLE): UINT; stdcall;
  1085. {$EXTERNALSYM MsiOpenPackageA}
  1086. function MsiOpenPackageW(szPackagePath: LPCWSTR; var hProduct: MSIHANDLE): UINT; stdcall;
  1087. {$EXTERNALSYM MsiOpenPackageW}
  1088. {$IFDEF UNICODE}
  1089. function MsiOpenPackage(szPackagePath: LPCWSTR; var hProduct: MSIHANDLE): UINT; stdcall;
  1090. {$EXTERNALSYM MsiOpenPackage}
  1091. {$ELSE}
  1092. function MsiOpenPackage(szPackagePath: LPCSTR; var hProduct: MSIHANDLE): UINT; stdcall;
  1093. {$EXTERNALSYM MsiOpenPackage}
  1094. {$ENDIF}
  1095. // Open a product package in order to access product properties
  1096. // Option to create a "safe" engine that does not look at machine state
  1097. //  and does not allow for modification of machine state
  1098. function MsiOpenPackageExA(szPackagePath: LPCSTR; dwOptions: DWORD; var hProduct: MSIHANDLE): UINT; stdcall;
  1099. {$EXTERNALSYM MsiOpenPackageExA}
  1100. function MsiOpenPackageExW(szPackagePath: LPCWSTR; dwOptions: DWORD; var hProduct: MSIHANDLE): UINT; stdcall;
  1101. {$EXTERNALSYM MsiOpenPackageExW}
  1102. {$IFDEF UNICODE}
  1103. function MsiOpenPackageEx(szPackagePath: LPCWSTR; dwOptions: DWORD; var hProduct: MSIHANDLE): UINT; stdcall;
  1104. {$EXTERNALSYM MsiOpenPackageEx}
  1105. {$ELSE}
  1106. function MsiOpenPackageEx(szPackagePath: LPCSTR; dwOptions: DWORD; var hProduct: MSIHANDLE): UINT; stdcall;
  1107. {$EXTERNALSYM MsiOpenPackageEx}
  1108. {$ENDIF}
  1109. // Provide the value for an installation property.
  1110. function MsiGetProductPropertyA(hProduct: MSIHANDLE; szProperty: LPCSTR;
  1111.   lpValueBuf: LPSTR; pcchValueBuf: LPDWORD): UINT; stdcall;
  1112. {$EXTERNALSYM MsiGetProductPropertyA}
  1113. function MsiGetProductPropertyW(hProduct: MSIHANDLE; szProperty: LPCWSTR;
  1114.   lpValueBuf: LPWSTR; pcchValueBuf: LPDWORD): UINT; stdcall;
  1115. {$EXTERNALSYM MsiGetProductPropertyW}
  1116. {$IFDEF UNICODE}
  1117. function MsiGetProductProperty(hProduct: MSIHANDLE; szProperty: LPCWSTR;
  1118.   lpValueBuf: LPWSTR; pcchValueBuf: LPDWORD): UINT; stdcall;
  1119. {$EXTERNALSYM MsiGetProductProperty}
  1120. {$ELSE}
  1121. function MsiGetProductProperty(hProduct: MSIHANDLE; szProperty: LPCSTR;
  1122.   lpValueBuf: LPSTR; pcchValueBuf: LPDWORD): UINT; stdcall;
  1123. {$EXTERNALSYM MsiGetProductProperty}
  1124. {$ENDIF}
  1125. // Determine whether a file is a package
  1126. // Returns ERROR_SUCCESS if file is a package.
  1127. function MsiVerifyPackageA(szPackagePath: LPCSTR): UINT; stdcall;
  1128. {$EXTERNALSYM MsiVerifyPackageA}
  1129. function MsiVerifyPackageW(szPackagePath: LPCWSTR): UINT; stdcall;
  1130. {$EXTERNALSYM MsiVerifyPackageW}
  1131. {$IFDEF UNICODE}
  1132. function MsiVerifyPackage(szPackagePath: LPCWSTR): UINT; stdcall;
  1133. {$EXTERNALSYM MsiVerifyPackage}
  1134. {$ELSE}
  1135. function MsiVerifyPackage(szPackagePath: LPCSTR): UINT; stdcall;
  1136. {$EXTERNALSYM MsiVerifyPackage}
  1137. {$ENDIF}
  1138. // Provide descriptive information for product feature: title and description.
  1139. // Returns the install level for the feature, or -1 if feature is unknown.
  1140. //   0 = feature is not available on this machine
  1141. //   1 = highest priority, feature installed if parent is installed
  1142. //  >1 = decreasing priority, feature installation based on InstallLevel property
  1143. function MsiGetFeatureInfoA(hProduct: MSIHANDLE; szFeature: LPCSTR; var lpAttributes: DWORD;
  1144.   lpTitleBuf: LPSTR; var pcchTitleBuf: DWORD; lpHelpBuf: LPSTR; var pcchHelpBuf: DWORD): UINT; stdcall;
  1145. {$EXTERNALSYM MsiGetFeatureInfoA}
  1146. function MsiGetFeatureInfoW(hProduct: MSIHANDLE; szFeature: LPCWSTR; var lpAttributes: DWORD;
  1147.   lpTitleBuf: LPWSTR; var pcchTitleBuf: DWORD; lpHelpBuf: LPWSTR; var pcchHelpBuf: DWORD): UINT; stdcall;
  1148. {$EXTERNALSYM MsiGetFeatureInfoW}
  1149. {$IFDEF UNICODE}
  1150. function MsiGetFeatureInfo(hProduct: MSIHANDLE; szFeature: LPCWSTR; var lpAttributes: DWORD;
  1151.   lpTitleBuf: LPWSTR; var pcchTitleBuf: DWORD; lpHelpBuf: LPWSTR; var pcchHelpBuf: DWORD): UINT; stdcall;
  1152. {$EXTERNALSYM MsiGetFeatureInfo}
  1153. {$ELSE}
  1154. function MsiGetFeatureInfo(hProduct: MSIHANDLE; szFeature: LPCSTR; var lpAttributes: DWORD;
  1155.   lpTitleBuf: LPSTR; var pcchTitleBuf: DWORD; lpHelpBuf: LPSTR; var pcchHelpBuf: DWORD): UINT; stdcall;
  1156. {$EXTERNALSYM MsiGetFeatureInfo}
  1157. {$ENDIF}
  1158. // --------------------------------------------------------------------------
  1159. // Functions to access or install missing components and files.
  1160. // These should be used as a last resort.
  1161. // --------------------------------------------------------------------------
  1162. // Install a component unexpectedly missing, provided only for error recovery
  1163. // This would typically occur due to failue to establish feature availability
  1164. // The product feature having the smallest incremental cost is installed
  1165. function MsiInstallMissingComponentA(szProduct: LPCSTR; szComponent: LPCSTR;
  1166.   eInstallState: INSTALLSTATE): UINT; stdcall;
  1167. {$EXTERNALSYM MsiInstallMissingComponentA}
  1168. function MsiInstallMissingComponentW(szProduct: LPCWSTR; szComponent: LPCWSTR;
  1169.   eInstallState: INSTALLSTATE): UINT; stdcall;
  1170. {$EXTERNALSYM MsiInstallMissingComponentW}
  1171. {$IFDEF UNICODE}
  1172. function MsiInstallMissingComponent(szProduct: LPCWSTR; szComponent: LPCWSTR;
  1173.   eInstallState: INSTALLSTATE): UINT; stdcall;
  1174. {$EXTERNALSYM MsiInstallMissingComponent}
  1175. {$ELSE}
  1176. function MsiInstallMissingComponent(szProduct: LPCSTR; szComponent: LPCSTR;
  1177.   eInstallState: INSTALLSTATE): UINT; stdcall;
  1178. {$EXTERNALSYM MsiInstallMissingComponent}
  1179. {$ENDIF}
  1180. // Install a file unexpectedly missing, provided only for error recovery
  1181. // This would typically occur due to failue to establish feature availability
  1182. // The missing component is determined from the product's File table, then
  1183. // the product feature having the smallest incremental cost is installed
  1184. function MsiInstallMissingFileA(szProduct: LPCSTR; szFile: LPCSTR): UINT; stdcall;
  1185. {$EXTERNALSYM MsiInstallMissingFileA}
  1186. function MsiInstallMissingFileW(szProduct: LPCWSTR; szFile: LPCWSTR): UINT; stdcall;
  1187. {$EXTERNALSYM MsiInstallMissingFileW}
  1188. {$IFDEF UNICODE}
  1189. function MsiInstallMissingFile(szProduct: LPCWSTR; szFile: LPCWSTR): UINT; stdcall;
  1190. {$EXTERNALSYM MsiInstallMissingFile}
  1191. {$ELSE}
  1192. function MsiInstallMissingFile(szProduct: LPCSTR; szFile: LPCSTR): UINT; stdcall;
  1193. {$EXTERNALSYM MsiInstallMissingFile}
  1194. {$ENDIF}
  1195. // Return full path to an installed component without a product code
  1196. // This function attempts to determine the product using MsiGetProductCode
  1197. // but is not guaranteed to find the correct product for the caller.
  1198. // MsiGetComponentPath should always be called when possible.
  1199. function MsiLocateComponentA(szComponent: LPCSTR; lpPathBuf: LPSTR; pcchBuf: LPDWORD): INSTALLSTATE; stdcall;
  1200. {$EXTERNALSYM MsiLocateComponentA}
  1201. function MsiLocateComponentW(szComponent: LPCWSTR; lpPathBuf: LPWSTR; pcchBuf: LPDWORD): INSTALLSTATE; stdcall;
  1202. {$EXTERNALSYM MsiLocateComponentW}
  1203. {$IFDEF UNICODE}
  1204. function MsiLocateComponent(szComponent: LPCWSTR; lpPathBuf: LPWSTR; pcchBuf: LPDWORD): INSTALLSTATE; stdcall;
  1205. {$EXTERNALSYM MsiLocateComponent}
  1206. {$ELSE}
  1207. function MsiLocateComponent(szComponent: LPCSTR; lpPathBuf: LPSTR; pcchBuf: LPDWORD): INSTALLSTATE; stdcall;
  1208. {$EXTERNALSYM MsiLocateComponent}
  1209. {$ENDIF}
  1210. {$IFDEF WIN32_MSI_110}
  1211. // --------------------------------------------------------------------------
  1212. // Functions used to manage the list of valid sources.
  1213. // --------------------------------------------------------------------------
  1214. // Opens the list of sources for the specified user's install of the product
  1215. // and removes all network sources from the list. A NULL or empty value for
  1216. // the user name indicates the per-machine install.
  1217. function MsiSourceListClearAllA(szProduct: LPCSTR; szUserName: LPCSTR; dwReserved: DWORD): UINT; stdcall;
  1218. {$EXTERNALSYM MsiSourceListClearAllA}
  1219. function MsiSourceListClearAllW(szProduct: LPCWSTR; szUserName: LPCWSTR; dwReserved: DWORD): UINT; stdcall;
  1220. {$EXTERNALSYM MsiSourceListClearAllW}
  1221. {$IFDEF UNICODE}
  1222. function MsiSourceListClearAll(szProduct: LPCWSTR; szUserName: LPCWSTR; dwReserved: DWORD): UINT; stdcall;
  1223. {$EXTERNALSYM MsiSourceListClearAll}
  1224. {$ELSE}
  1225. function MsiSourceListClearAll(szProduct: LPCSTR; szUserName: LPCSTR; dwReserved: DWORD): UINT; stdcall;
  1226. {$EXTERNALSYM MsiSourceListClearAll}
  1227. {$ENDIF}
  1228. // Opens the list of sources for the specified user's install of the product
  1229. // and adds the provided source as a new network source. A NULL or empty
  1230. // value for the user name indicates the per-machine install.
  1231. function MsiSourceListAddSourceA(szProduct: LPCSTR; szUserName: LPCSTR;
  1232.   dwReserved: DWORD; szSource: LPCSTR): UINT; stdcall;
  1233. {$EXTERNALSYM MsiSourceListAddSourceA}
  1234. function MsiSourceListAddSourceW(szProduct: LPCWSTR; szUserName: LPCWSTR;
  1235.   dwReserved: DWORD; szSource: LPCWSTR): UINT; stdcall;
  1236. {$EXTERNALSYM MsiSourceListAddSourceW}
  1237. {$IFDEF UNICODE}
  1238. function MsiSourceListAddSource(szProduct: LPCWSTR; szUserName: LPCWSTR;
  1239.   dwReserved: DWORD; szSource: LPCWSTR): UINT; stdcall;
  1240. {$EXTERNALSYM MsiSourceListAddSource}
  1241. {$ELSE}
  1242. function MsiSourceListAddSource(szProduct: LPCSTR; szUserName: LPCSTR;
  1243.   dwReserved: DWORD; szSource: LPCSTR): UINT; stdcall;
  1244. {$EXTERNALSYM MsiSourceListAddSource}
  1245. {$ENDIF}
  1246. // Forces the installer to reevaluate the list of sources the next time that
  1247. // the specified product needs a source.
  1248. function MsiSourceListForceResolutionA(szProduct, szUserName: LPCSTR; dwReserved: DWORD): UINT; stdcall;
  1249. {$EXTERNALSYM MsiSourceListForceResolutionA}
  1250. function MsiSourceListForceResolutionW(szProduct, szUserName: LPCWSTR; dwReserved: DWORD): UINT; stdcall;
  1251. {$EXTERNALSYM MsiSourceListForceResolutionW}
  1252. {$IFDEF UNICODE}
  1253. function MsiSourceListForceResolution(szProduct, szUserName: LPCWSTR; dwReserved: DWORD): UINT; stdcall;
  1254. {$EXTERNALSYM MsiSourceListForceResolution}
  1255. {$ELSE}
  1256. function MsiSourceListForceResolution(szProduct, szUserName: LPCSTR; dwReserved: DWORD): UINT; stdcall;
  1257. {$EXTERNALSYM MsiSourceListForceResolution}
  1258. {$ENDIF}
  1259. {$ENDIF WIN32_MSI_110}
  1260. // --------------------------------------------------------------------------
  1261. // Utility functions
  1262. // --------------------------------------------------------------------------
  1263. // Give the version string and language for a specified file
  1264. function MsiGetFileVersionA(szFilePath: LPCSTR; lpVersionBuf: LPSTR;
  1265.   var pcchVersionBuf: DWORD; lpLangBuf: LPSTR; var pcchLangBuf: DWORD): UINT; stdcall;
  1266. {$EXTERNALSYM MsiGetFileVersionA}
  1267. function MsiGetFileVersionW(szFilePath: LPCWSTR; lpVersionBuf: LPWSTR;
  1268.   var pcchVersionBuf: DWORD; lpLangBuf: LPWSTR; var pcchLangBuf: DWORD): UINT; stdcall;
  1269. {$EXTERNALSYM MsiGetFileVersionW}
  1270. {$IFDEF UNICODE}
  1271. function MsiGetFileVersion(szFilePath: LPCWSTR; lpVersionBuf: LPWSTR;
  1272.   var pcchVersionBuf: DWORD; lpLangBuf: LPWSTR; var pcchLangBuf: DWORD): UINT; stdcall;
  1273. {$EXTERNALSYM MsiGetFileVersion}
  1274. {$ELSE}
  1275. function MsiGetFileVersion(szFilePath: LPCSTR; lpVersionBuf: LPSTR;
  1276.   var pcchVersionBuf: DWORD; lpLangBuf: LPSTR; var pcchLangBuf: DWORD): UINT; stdcall;
  1277. {$EXTERNALSYM MsiGetFileVersion}
  1278. {$ENDIF}
  1279. function MsiGetFileHashA(szFilePath: LPCSTR; dwOptions: DWORD; pHash: PMSIFILEHASHINFO): UINT; stdcall;
  1280. {$EXTERNALSYM MsiGetFileHashA}
  1281. function MsiGetFileHashW(szFilePath: LPCWSTR; dwOptions: DWORD; pHash: PMSIFILEHASHINFO): UINT; stdcall;
  1282. {$EXTERNALSYM MsiGetFileHashW}
  1283. {$IFDEF UNICODE}
  1284. function MsiGetFileHash(szFilePath: LPCWSTR; dwOptions: DWORD; pHash: PMSIFILEHASHINFO): UINT; stdcall;
  1285. {$EXTERNALSYM MsiGetFileHash}
  1286. {$ELSE}
  1287. function MsiGetFileHash(szFilePath: LPCSTR; dwOptions: DWORD; pHash: PMSIFILEHASHINFO): UINT; stdcall;
  1288. {$EXTERNALSYM MsiGetFileHash}
  1289. {$ENDIF}
  1290. function MsiGetFileSignatureInformationA(szSignedObjectPath: LPCSTR; dwFlags: DWORD; var ppcCertContext: PCCERT_CONTEXT;
  1291.   pbHashData: LPBYTE; pcbHashData: LPDWORD): HRESULT; stdcall;
  1292. {$EXTERNALSYM MsiGetFileSignatureInformationA}
  1293. function MsiGetFileSignatureInformationW(szSignedObjectPath: LPCWSTR; dwFlags: DWORD; var ppcCertContext: PCCERT_CONTEXT;
  1294.   pbHashData: LPBYTE; pcbHashData: LPDWORD): HRESULT; stdcall;
  1295. {$EXTERNALSYM MsiGetFileSignatureInformationW}
  1296. {$IFDEF UNICODE}
  1297. function MsiGetFileSignatureInformation(szSignedObjectPath: LPCWSTR; dwFlags: DWORD; var ppcCertContext: PCCERT_CONTEXT;
  1298.   pbHashData: LPBYTE; pcbHashData: LPDWORD): HRESULT; stdcall;
  1299. {$EXTERNALSYM MsiGetFileSignatureInformation}
  1300. {$ELSE}
  1301. function MsiGetFileSignatureInformation(szSignedObjectPath: LPCSTR; dwFlags: DWORD; var ppcCertContext: PCCERT_CONTEXT;
  1302.   pbHashData: LPBYTE; pcbHashData: LPDWORD): HRESULT; stdcall;
  1303. {$EXTERNALSYM MsiGetFileSignatureInformation}
  1304. {$ENDIF}
  1305. // By default, when only requesting the certificate context, an invalid hash
  1306. // in the digital signature is not a fatal error.  Set this flag in the dwFlags
  1307. // parameter to make the TRUST_E_BAD_DIGEST error fatal.
  1308. const
  1309.   MSI_INVALID_HASH_IS_FATAL = $1;
  1310.   {$EXTERNALSYM MSI_INVALID_HASH_IS_FATAL}
  1311. {$IFDEF WIN32_MSI_110}
  1312. // examine a shortcut, and retrieve its descriptor information
  1313. // if available.
  1314. function MsiGetShortcutTargetA(szShortcutPath: LPCSTR; szProductCode: LPSTR;
  1315.   szFeatureId: LPSTR; szComponentCode: LPSTR): UINT; stdcall;
  1316. {$EXTERNALSYM MsiGetShortcutTargetA}
  1317. function MsiGetShortcutTargetW(szShortcutPath: LPCWSTR; szProductCode: LPWSTR;
  1318.   szFeatureId: LPWSTR; szComponentCode: LPWSTR): UINT; stdcall;
  1319. {$EXTERNALSYM MsiGetShortcutTargetW}
  1320. {$IFDEF UNICODE}
  1321. function MsiGetShortcutTarget(szShortcutPath: LPCWSTR; szProductCode: LPWSTR;
  1322.   szFeatureId: LPWSTR; szComponentCode: LPWSTR): UINT; stdcall;
  1323. {$EXTERNALSYM MsiGetShortcutTarget}
  1324. {$ELSE}
  1325. function MsiGetShortcutTarget(szShortcutPath: LPCSTR; szProductCode: LPSTR;
  1326.   szFeatureId: LPSTR; szComponentCode: LPSTR): UINT; stdcall;
  1327. {$EXTERNALSYM MsiGetShortcutTarget}
  1328. {$ENDIF}
  1329. {$ENDIF WIN32_MSI_110}
  1330. // checks to see if a product is managed
  1331. // checks per-machine if called from system context, per-user if from
  1332. // user context
  1333. function MsiIsProductElevatedA(szProduct: LPCSTR; var pfElevated: BOOL): UINT; stdcall;
  1334. {$EXTERNALSYM MsiIsProductElevatedA}
  1335. function MsiIsProductElevatedW(szProduct: LPCWSTR; var pfElevated: BOOL): UINT; stdcall;
  1336. {$EXTERNALSYM MsiIsProductElevatedW}
  1337. {$IFDEF UNICODE}
  1338. function MsiIsProductElevated(szProduct: LPCWSTR; var pfElevated: BOOL): UINT; stdcall;
  1339. {$EXTERNALSYM MsiIsProductElevated}
  1340. {$ELSE}
  1341. function MsiIsProductElevated(szProduct: LPCSTR; var pfElevated: BOOL): UINT; stdcall;
  1342. {$EXTERNALSYM MsiIsProductElevated}
  1343. {$ENDIF}
  1344. // --------------------------------------------------------------------------
  1345. // Error codes for installer access functions - until merged to winerr.h
  1346. // --------------------------------------------------------------------------
  1347. const
  1348.   ERROR_INSTALL_USEREXIT      = 1602; // User cancel installation.
  1349.   {$EXTERNALSYM ERROR_INSTALL_USEREXIT}
  1350.   ERROR_INSTALL_FAILURE       = 1603; // Fatal error during installation.
  1351.   {$EXTERNALSYM ERROR_INSTALL_FAILURE}
  1352.   ERROR_INSTALL_SUSPEND       = 1604; // Installation suspended, incomplete.
  1353.   {$EXTERNALSYM ERROR_INSTALL_SUSPEND}
  1354.   ERROR_UNKNOWN_PRODUCT       = 1605; // This action is only valid for products that are currently installed.
  1355.   {$EXTERNALSYM ERROR_UNKNOWN_PRODUCT}
  1356.   ERROR_UNKNOWN_FEATURE       = 1606; // Feature ID not registered.
  1357.   {$EXTERNALSYM ERROR_UNKNOWN_FEATURE}
  1358.   ERROR_UNKNOWN_COMPONENT     = 1607; // Component ID not registered.
  1359.   {$EXTERNALSYM ERROR_UNKNOWN_COMPONENT}
  1360.   ERROR_UNKNOWN_PROPERTY      = 1608; // Unknown property.
  1361.   {$EXTERNALSYM ERROR_UNKNOWN_PROPERTY}
  1362.   ERROR_INVALID_HANDLE_STATE  = 1609; // Handle is in an invalid state.
  1363.   {$EXTERNALSYM ERROR_INVALID_HANDLE_STATE}
  1364.   ERROR_BAD_CONFIGURATION     = 1610; // The configuration data for this product is corrupt.  Contact your support personnel.
  1365.   {$EXTERNALSYM ERROR_BAD_CONFIGURATION}
  1366.   ERROR_INDEX_ABSENT          = 1611; // Component qualifier not present.
  1367.   {$EXTERNALSYM ERROR_INDEX_ABSENT}
  1368.   ERROR_INSTALL_SOURCE_ABSENT = 1612; // The installation source for this product is not available.  Verify that the source exists and that you can access it.
  1369.   {$EXTERNALSYM ERROR_INSTALL_SOURCE_ABSENT}
  1370.   ERROR_PRODUCT_UNINSTALLED   = 1614; // Product is uninstalled.
  1371.   {$EXTERNALSYM ERROR_PRODUCT_UNINSTALLED}
  1372.   ERROR_BAD_QUERY_SYNTAX      = 1615; // SQL query syntax invalid or unsupported.
  1373.   {$EXTERNALSYM ERROR_BAD_QUERY_SYNTAX}
  1374.   ERROR_INVALID_FIELD         = 1616; // Record field does not exist.
  1375.   {$EXTERNALSYM ERROR_INVALID_FIELD}
  1376.   ERROR_INSTALL_SERVICE_FAILURE      = 1601; // The Windows Installer service could not be accessed.  Contact your support personnel to verify that the Windows Installer service is properly registered.
  1377.   {$EXTERNALSYM ERROR_INSTALL_SERVICE_FAILURE}
  1378.   ERROR_INSTALL_PACKAGE_VERSION      = 1613; // This installation package cannot be installed by the Windows Installer service.  You must install a Windows service pack that contains a newer version of the Windows Installer service.
  1379.   {$EXTERNALSYM ERROR_INSTALL_PACKAGE_VERSION}
  1380.   ERROR_INSTALL_ALREADY_RUNNING      = 1618; // Another installation is already in progress.  Complete that installation before proceeding with this install.
  1381.   {$EXTERNALSYM ERROR_INSTALL_ALREADY_RUNNING}
  1382.   ERROR_INSTALL_PACKAGE_OPEN_FAILED  = 1619; // This installation package could not be opened.  Verify that the package exists and that you can access it, or contact the application vendor to verify that this is a valid Windows Installer package.
  1383.   {$EXTERNALSYM ERROR_INSTALL_PACKAGE_OPEN_FAILED}
  1384.   ERROR_INSTALL_PACKAGE_INVALID      = 1620; // This installation package could not be opened.  Contact the application vendor to verify that this is a valid Windows Installer package.
  1385.   {$EXTERNALSYM ERROR_INSTALL_PACKAGE_INVALID}
  1386.   ERROR_INSTALL_UI_FAILURE           = 1621; // There was an error starting the Windows Installer service user interface.  Contact your support personnel.
  1387.   {$EXTERNALSYM ERROR_INSTALL_UI_FAILURE}
  1388.   ERROR_INSTALL_LOG_FAILURE          = 1622; // Error opening installation log file.  Verify that the specified log file location exists and is writable.
  1389.   {$EXTERNALSYM ERROR_INSTALL_LOG_FAILURE}
  1390.   ERROR_INSTALL_LANGUAGE_UNSUPPORTED = 1623; // This language of this installation package is not supported by your system.
  1391.   {$EXTERNALSYM ERROR_INSTALL_LANGUAGE_UNSUPPORTED}
  1392.   ERROR_INSTALL_PACKAGE_REJECTED     = 1625; // The system administrator has set policies to prevent this installation.
  1393.   {$EXTERNALSYM ERROR_INSTALL_PACKAGE_REJECTED}
  1394.   ERROR_FUNCTION_NOT_CALLED = 1626; // Function could not be executed.
  1395.   {$EXTERNALSYM ERROR_FUNCTION_NOT_CALLED}
  1396.   ERROR_FUNCTION_FAILED     = 1627; // Function failed during execution.
  1397.   {$EXTERNALSYM ERROR_FUNCTION_FAILED}
  1398.   ERROR_INVALID_TABLE       = 1628; // Invalid or unknown table specified.
  1399.   {$EXTERNALSYM ERROR_INVALID_TABLE}
  1400.   ERROR_DATATYPE_MISMATCH   = 1629; // Data supplied is of wrong type.
  1401.   {$EXTERNALSYM ERROR_DATATYPE_MISMATCH}
  1402.   ERROR_UNSUPPORTED_TYPE    = 1630; // Data of this type is not supported.
  1403.   {$EXTERNALSYM ERROR_UNSUPPORTED_TYPE}
  1404.   ERROR_CREATE_FAILED       = 1631; // The Windows Installer service failed to start.  Contact your support personnel.
  1405.   {$EXTERNALSYM ERROR_CREATE_FAILED}
  1406.   ERROR_INSTALL_TEMP_UNWRITABLE = 1632; // The Temp folder is on a drive that is full or is inaccessible. Free up space on the drive or verify that you have write permission on the Temp folder.
  1407.   {$EXTERNALSYM ERROR_INSTALL_TEMP_UNWRITABLE}
  1408.   ERROR_INSTALL_PLATFORM_UNSUPPORTED = 1633; // This installation package is not supported by this processor type. Contact your product vendor.
  1409.   {$EXTERNALSYM ERROR_INSTALL_PLATFORM_UNSUPPORTED}
  1410.   ERROR_INSTALL_NOTUSED = 1634; // Component not used on this machine
  1411.   {$EXTERNALSYM ERROR_INSTALL_NOTUSED}
  1412.   ERROR_INSTALL_TRANSFORM_FAILURE = 1624; // Error applying transforms.  Verify that the specified transform paths are valid.
  1413.   {$EXTERNALSYM ERROR_INSTALL_TRANSFORM_FAILURE}
  1414.   ERROR_PATCH_PACKAGE_OPEN_FAILED = 1635; // This patch package could not be opened.  Verify that the patch package exists and that you can access it, or contact the application vendor to verify that this is a valid Windows Installer patch package.
  1415.   {$EXTERNALSYM ERROR_PATCH_PACKAGE_OPEN_FAILED}
  1416.   ERROR_PATCH_PACKAGE_INVALID     = 1636; // This patch package could not be opened.  Contact the application vendor to verify that this is a valid Windows Installer patch package.
  1417.   {$EXTERNALSYM ERROR_PATCH_PACKAGE_INVALID}
  1418.   ERROR_PATCH_PACKAGE_UNSUPPORTED = 1637; // This patch package cannot be processed by the Windows Installer service.  You must install a Windows service pack that contains a newer version of the Windows Installer service.
  1419.   {$EXTERNALSYM ERROR_PATCH_PACKAGE_UNSUPPORTED}
  1420.   ERROR_PRODUCT_VERSION = 1638; // Another version of this product is already installed.  Installation of this version cannot continue.  To configure or remove the existing version of this product, use Add/Remove Programs on the Control Panel.
  1421.   {$EXTERNALSYM ERROR_PRODUCT_VERSION}
  1422.   ERROR_INVALID_COMMAND_LINE = 1639; // Invalid command line argument.  Consult the Windows Installer SDK for detailed command line help.
  1423.   {$EXTERNALSYM ERROR_INVALID_COMMAND_LINE}
  1424. // The following three error codes are not returned from MSI version 1.0
  1425.   ERROR_INSTALL_REMOTE_DISALLOWED = 1640; // Configuration of this product is not permitted from remote sessions. Contact your administrator.
  1426.   {$EXTERNALSYM ERROR_INSTALL_REMOTE_DISALLOWED}
  1427.   ERROR_SUCCESS_REBOOT_INITIATED = 1641; // The requested operation completed successfully.  The system will be restarted so the changes can take effect.
  1428.   {$EXTERNALSYM ERROR_SUCCESS_REBOOT_INITIATED}
  1429.   ERROR_PATCH_TARGET_NOT_FOUND = 1642; // The upgrade patch cannot be installed by the Windows Installer service because the program to be upgraded may be missing, or the upgrade patch may update a different version of the program. Verify that the program to be upgraded exists on your computer and that you have the correct upgrade patch.
  1430.   {$EXTERNALSYM ERROR_PATCH_TARGET_NOT_FOUND}
  1431. // The following two error codes are not returned from MSI version 1.0, 1.1. or 1.2
  1432.   ERROR_PATCH_PACKAGE_REJECTED      = 1643; // The patch package is not permitted by software restriction policy.
  1433.   {$EXTERNALSYM ERROR_PATCH_PACKAGE_REJECTED}
  1434.   ERROR_INSTALL_TRANSFORM_REJECTED  = 1644; // One or more customizations are not permitted by software restriction policy.
  1435.   {$EXTERNALSYM ERROR_INSTALL_TRANSFORM_REJECTED}
  1436. // The following error code is returned only from MSI post version 2.0
  1437. // LOCALIZE BEGIN:
  1438. //#ifndef ERROR_INSTALL_REMOTE_PROHIBITED
  1439.   ERROR_INSTALL_REMOTE_PROHIBITED   = 1645; // The Windows Installer does not permit installation from a Remote Desktop Connection.
  1440.   {$EXTERNALSYM ERROR_INSTALL_REMOTE_PROHIBITED}
  1441. //#endif
  1442. // LOCALIZE END
  1443. implementation
  1444. const
  1445.   msilib = 'msi.dll';
  1446. {$IFDEF DYNAMIC_LINK}
  1447. var
  1448.   _MsiCloseHandle: Pointer;
  1449. function MsiCloseHandle;
  1450. begin
  1451.   GetProcedureAddress(_MsiCloseHandle, msilib, 'MsiCloseHandle');
  1452.   asm
  1453.     mov esp, ebp
  1454.     pop ebp
  1455.     jmp [_MsiCloseHandle]
  1456.   end;
  1457. end;
  1458. {$ELSE}
  1459. function MsiCloseHandle; external msilib name 'MsiCloseHandle';
  1460. {$ENDIF DYNAMIC_LINK}
  1461. {$IFDEF DYNAMIC_LINK}
  1462. var
  1463.   _MsiCloseAllHandles: Pointer;
  1464. function MsiCloseAllHandles;
  1465. begin
  1466.   GetProcedureAddress(_MsiCloseAllHandles, msilib, 'MsiCloseAllHandles');
  1467.   asm
  1468.     mov esp, ebp
  1469.     pop ebp
  1470.     jmp [_MsiCloseAllHandles]
  1471.   end;
  1472. end;
  1473. {$ELSE}
  1474. function MsiCloseAllHandles; external msilib name 'MsiCloseAllHandles';
  1475. {$ENDIF DYNAMIC_LINK}
  1476. {$IFDEF DYNAMIC_LINK}
  1477. var
  1478.   _MsiSetInternalUI: Pointer;
  1479. function MsiSetInternalUI;
  1480. begin
  1481.   GetProcedureAddress(_MsiSetInternalUI, msilib, 'MsiSetInternalUI');
  1482.   asm
  1483.     mov esp, ebp
  1484.     pop ebp
  1485.     jmp [_MsiSetInternalUI]
  1486.   end;
  1487. end;
  1488. {$ELSE}
  1489. function MsiSetInternalUI; external msilib name 'MsiSetInternalUI';
  1490. {$ENDIF DYNAMIC_LINK}
  1491. {$IFDEF DYNAMIC_LINK}
  1492. var
  1493.   _MsiSetExternalUIA: Pointer;
  1494. function MsiSetExternalUIA;
  1495. begin
  1496.   GetProcedureAddress(_MsiSetExternalUIA, msilib, 'MsiSetExternalUIA');
  1497.   asm
  1498.     mov esp, ebp
  1499.     pop ebp
  1500.     jmp [_MsiSetExternalUIA]
  1501.   end;
  1502. end;
  1503. {$ELSE}
  1504. function MsiSetExternalUIA; external msilib name 'MsiSetExternalUIA';
  1505. {$ENDIF DYNAMIC_LINK}
  1506. {$IFDEF DYNAMIC_LINK}
  1507. var
  1508.   _MsiSetExternalUIW: Pointer;
  1509. function MsiSetExternalUIW;
  1510. begin
  1511.   GetProcedureAddress(_MsiSetExternalUIW, msilib, 'MsiSetExternalUIW');
  1512.   asm
  1513.     mov esp, ebp
  1514.     pop ebp
  1515.     jmp [_MsiSetExternalUIW]
  1516.   end;
  1517. end;
  1518. {$ELSE}
  1519. function MsiSetExternalUIW; external msilib name 'MsiSetExternalUIW';
  1520. {$ENDIF DYNAMIC_LINK}
  1521. {$IFDEF UNICODE}
  1522. {$IFDEF DYNAMIC_LINK}
  1523. var
  1524.   _MsiSetExternalUI: Pointer;
  1525. function MsiSetExternalUI;
  1526. begin
  1527.   GetProcedureAddress(_MsiSetExternalUI, msilib, 'MsiSetExternalUIW');
  1528.   asm
  1529.     mov esp, ebp
  1530.     pop ebp
  1531.     jmp [_MsiSetExternalUI]
  1532.   end;
  1533. end;
  1534. {$ELSE}
  1535. function MsiSetExternalUI; external msilib name 'MsiSetExternalUIW';
  1536. {$ENDIF DYNAMIC_LINK}
  1537. {$ELSE}
  1538. {$IFDEF DYNAMIC_LINK}
  1539. var
  1540.   _MsiSetExternalUI: Pointer;
  1541. function MsiSetExternalUI;
  1542. begin
  1543.   GetProcedureAddress(_MsiSetExternalUI, msilib, 'MsiSetExternalUIA');
  1544.   asm
  1545.     mov esp, ebp
  1546.     pop ebp
  1547.     jmp [_MsiSetExternalUI]
  1548.   end;
  1549. end;
  1550. {$ELSE}
  1551. function MsiSetExternalUI; external msilib name 'MsiSetExternalUIA';
  1552. {$ENDIF DYNAMIC_LINK}
  1553. {$ENDIF}
  1554. {$IFDEF DYNAMIC_LINK}
  1555. var
  1556.   _MsiEnableLogA: Pointer;
  1557. function MsiEnableLogA;
  1558. begin
  1559.   GetProcedureAddress(_MsiEnableLogA, msilib, 'MsiEnableLogA');
  1560.   asm
  1561.     mov esp, ebp
  1562.     pop ebp
  1563.     jmp [_MsiEnableLogA]
  1564.   end;
  1565. end;
  1566. {$ELSE}
  1567. function MsiEnableLogA; external msilib name 'MsiEnableLogA';
  1568. {$ENDIF DYNAMIC_LINK}
  1569. {$IFDEF DYNAMIC_LINK}
  1570. var
  1571.   _MsiEnableLogW: Pointer;
  1572. function MsiEnableLogW;
  1573. begin
  1574.   GetProcedureAddress(_MsiEnableLogW, msilib, 'MsiEnableLogW');
  1575.   asm
  1576.     mov esp, ebp
  1577.     pop ebp
  1578.     jmp [_MsiEnableLogW]
  1579.   end;
  1580. end;
  1581. {$ELSE}
  1582. function MsiEnableLogW; external msilib name 'MsiEnableLogW';
  1583. {$ENDIF DYNAMIC_LINK}
  1584. {$IFDEF UNICODE}
  1585. {$IFDEF DYNAMIC_LINK}
  1586. var
  1587.   _MsiEnableLog: Pointer;
  1588. function MsiEnableLog;
  1589. begin
  1590.   GetProcedureAddress(_MsiEnableLog, msilib, 'MsiEnableLogW');
  1591.   asm
  1592.     mov esp, ebp
  1593.     pop ebp
  1594.     jmp [_MsiEnableLog]
  1595.   end;
  1596. end;
  1597. {$ELSE}
  1598. function MsiEnableLog; external msilib name 'MsiEnableLogW';
  1599. {$ENDIF DYNAMIC_LINK}
  1600. {$ELSE}
  1601. {$IFDEF DYNAMIC_LINK}
  1602. var
  1603.   _MsiEnableLog: Pointer;
  1604. function MsiEnableLog;
  1605. begin
  1606.   GetProcedureAddress(_MsiEnableLog, msilib, 'MsiEnableLogA');
  1607.   asm
  1608.     mov esp, ebp
  1609.     pop ebp
  1610.     jmp [_MsiEnableLog]
  1611.   end;
  1612. end;
  1613. {$ELSE}
  1614. function MsiEnableLog; external msilib name 'MsiEnableLogA';
  1615. {$ENDIF DYNAMIC_LINK}
  1616. {$ENDIF}
  1617. {$IFDEF DYNAMIC_LINK}
  1618. var
  1619.   _MsiQueryProductStateA: Pointer;
  1620. function MsiQueryProductStateA;
  1621. begin
  1622.   GetProcedureAddress(_MsiQueryProductStateA, msilib, 'MsiQueryProductStateA');
  1623.   asm
  1624.     mov esp, ebp
  1625.     pop ebp
  1626.     jmp [_MsiQueryProductStateA]
  1627.   end;
  1628. end;
  1629. {$ELSE}
  1630. function MsiQueryProductStateA; external msilib name 'MsiQueryProductStateA';
  1631. {$ENDIF DYNAMIC_LINK}
  1632. {$IFDEF DYNAMIC_LINK}
  1633. var
  1634.   _MsiQueryProductStateW: Pointer;
  1635. function MsiQueryProductStateW;
  1636. begin
  1637.   GetProcedureAddress(_MsiQueryProductStateW, msilib, 'MsiQueryProductStateW');
  1638.   asm
  1639.     mov esp, ebp
  1640.     pop ebp
  1641.     jmp [_MsiQueryProductStateW]
  1642.   end;
  1643. end;
  1644. {$ELSE}
  1645. function MsiQueryProductStateW; external msilib name 'MsiQueryProductStateW';
  1646. {$ENDIF DYNAMIC_LINK}
  1647. {$IFDEF UNICODE}
  1648. {$IFDEF DYNAMIC_LINK}
  1649. var
  1650.   _MsiQueryProductState: Pointer;
  1651. function MsiQueryProductState;
  1652. begin
  1653.   GetProcedureAddress(_MsiQueryProductState, msilib, 'MsiQueryProductStateW');
  1654.   asm
  1655.     mov esp, ebp
  1656.     pop ebp
  1657.     jmp [_MsiQueryProductState]
  1658.   end;
  1659. end;
  1660. {$ELSE}
  1661. function MsiQueryProductState; external msilib name 'MsiQueryProductStateW';
  1662. {$ENDIF DYNAMIC_LINK}
  1663. {$ELSE}
  1664. {$IFDEF DYNAMIC_LINK}
  1665. var
  1666.   _MsiQueryProductState: Pointer;
  1667. function MsiQueryProductState;
  1668. begin
  1669.   GetProcedureAddress(_MsiQueryProductState, msilib, 'MsiQueryProductStateA');
  1670.   asm
  1671.     mov esp, ebp
  1672.     pop ebp
  1673.     jmp [_MsiQueryProductState]
  1674.   end;
  1675. end;
  1676. {$ELSE}
  1677. function MsiQueryProductState; external msilib name 'MsiQueryProductStateA';
  1678. {$ENDIF DYNAMIC_LINK}
  1679. {$ENDIF}
  1680. {$IFDEF DYNAMIC_LINK}
  1681. var
  1682.   _MsiGetProductInfoA: Pointer;
  1683. function MsiGetProductInfoA;
  1684. begin
  1685.   GetProcedureAddress(_MsiGetProductInfoA, msilib, 'MsiGetProductInfoA');
  1686.   asm
  1687.     mov esp, ebp
  1688.     pop ebp
  1689.     jmp [_MsiGetProductInfoA]
  1690.   end;
  1691. end;
  1692. {$ELSE}
  1693. function MsiGetProductInfoA; external msilib name 'MsiGetProductInfoA';
  1694. {$ENDIF DYNAMIC_LINK}
  1695. {$IFDEF DYNAMIC_LINK}
  1696. var
  1697.   _MsiGetProductInfoW: Pointer;
  1698. function MsiGetProductInfoW;
  1699. begin
  1700.   GetProcedureAddress(_MsiGetProductInfoW, msilib, 'MsiGetProductInfoW');
  1701.   asm
  1702.     mov esp, ebp
  1703.     pop ebp
  1704.     jmp [_MsiGetProductInfoW]
  1705.   end;
  1706. end;
  1707. {$ELSE}
  1708. function MsiGetProductInfoW; external msilib name 'MsiGetProductInfoW';
  1709. {$ENDIF DYNAMIC_LINK}
  1710. {$IFDEF UNICODE}
  1711. {$IFDEF DYNAMIC_LINK}
  1712. var
  1713.   _MsiGetProductInfo: Pointer;
  1714. function MsiGetProductInfo;
  1715. begin
  1716.   GetProcedureAddress(_MsiGetProductInfo, msilib, 'MsiGetProductInfoW');
  1717.   asm
  1718.     mov esp, ebp
  1719.     pop ebp
  1720.     jmp [_MsiGetProductInfo]
  1721.   end;
  1722. end;
  1723. {$ELSE}
  1724. function MsiGetProductInfo; external msilib name 'MsiGetProductInfoW';
  1725. {$ENDIF DYNAMIC_LINK}
  1726. {$ELSE}
  1727. {$IFDEF DYNAMIC_LINK}
  1728. var
  1729.   _MsiGetProductInfo: Pointer;
  1730. function MsiGetProductInfo;
  1731. begin
  1732.   GetProcedureAddress(_MsiGetProductInfo, msilib, 'MsiGetProductInfoA');
  1733.   asm
  1734.     mov esp, ebp
  1735.     pop ebp
  1736.     jmp [_MsiGetProductInfo]
  1737.   end;
  1738. end;
  1739. {$ELSE}
  1740. function MsiGetProductInfo; external msilib name 'MsiGetProductInfoA';
  1741. {$ENDIF DYNAMIC_LINK}
  1742. {$ENDIF}
  1743. {$IFDEF DYNAMIC_LINK}
  1744. var
  1745.   _MsiInstallProductA: Pointer;
  1746. function MsiInstallProductA;
  1747. begin
  1748.   GetProcedureAddress(_MsiInstallProductA, msilib, 'MsiInstallProductA');
  1749.   asm
  1750.     mov esp, ebp
  1751.     pop ebp
  1752.     jmp [_MsiInstallProductA]
  1753.   end;
  1754. end;
  1755. {$ELSE}
  1756. function MsiInstallProductA; external msilib name 'MsiInstallProductA';
  1757. {$ENDIF DYNAMIC_LINK}
  1758. {$IFDEF DYNAMIC_LINK}
  1759. var
  1760.   _MsiInstallProductW: Pointer;
  1761. function MsiInstallProductW;
  1762. begin
  1763.   GetProcedureAddress(_MsiInstallProductW, msilib, 'MsiInstallProductW');
  1764.   asm
  1765.     mov esp, ebp
  1766.     pop ebp
  1767.     jmp [_MsiInstallProductW]
  1768.   end;
  1769. end;
  1770. {$ELSE}
  1771. function MsiInstallProductW; external msilib name 'MsiInstallProductW';
  1772. {$ENDIF DYNAMIC_LINK}
  1773. {$IFDEF UNICODE}
  1774. {$IFDEF DYNAMIC_LINK}
  1775. var
  1776.   _MsiInstallProduct: Pointer;
  1777. function MsiInstallProduct;
  1778. begin
  1779.   GetProcedureAddress(_MsiInstallProduct, msilib, 'MsiInstallProductW');
  1780.   asm
  1781.     mov esp, ebp
  1782.     pop ebp
  1783.     jmp [_MsiInstallProduct]
  1784.   end;
  1785. end;
  1786. {$ELSE}
  1787. function MsiInstallProduct; external msilib name 'MsiInstallProductW';
  1788. {$ENDIF DYNAMIC_LINK}
  1789. {$ELSE}
  1790. {$IFDEF DYNAMIC_LINK}
  1791. var
  1792.   _MsiInstallProduct: Pointer;
  1793. function MsiInstallProduct;
  1794. begin
  1795.   GetProcedureAddress(_MsiInstallProduct, msilib, 'MsiInstallProductA');
  1796.   asm
  1797.     mov esp, ebp
  1798.     pop ebp
  1799.     jmp [_MsiInstallProduct]
  1800.   end;
  1801. end;
  1802. {$ELSE}
  1803. function MsiInstallProduct; external msilib name 'MsiInstallProductA';
  1804. {$ENDIF DYNAMIC_LINK}
  1805. {$ENDIF}
  1806. {$IFDEF DYNAMIC_LINK}
  1807. var
  1808.   _MsiConfigureProductA: Pointer;
  1809. function MsiConfigureProductA;
  1810. begin
  1811.   GetProcedureAddress(_MsiConfigureProductA, msilib, 'MsiConfigureProductA');
  1812.   asm
  1813.     mov esp, ebp
  1814.     pop ebp
  1815.     jmp [_MsiConfigureProductA]
  1816.   end;
  1817. end;
  1818. {$ELSE}
  1819. function MsiConfigureProductA; external msilib name 'MsiConfigureProductA';
  1820. {$ENDIF DYNAMIC_LINK}
  1821. {$IFDEF DYNAMIC_LINK}
  1822. var
  1823.   _MsiConfigureProductW: Pointer;
  1824. function MsiConfigureProductW;
  1825. begin
  1826.   GetProcedureAddress(_MsiConfigureProductW, msilib, 'MsiConfigureProductW');
  1827.   asm
  1828.     mov esp, ebp
  1829.     pop ebp
  1830.     jmp [_MsiConfigureProductW]
  1831.   end;
  1832. end;
  1833. {$ELSE}
  1834. function MsiConfigureProductW; external msilib name 'MsiConfigureProductW';
  1835. {$ENDIF DYNAMIC_LINK}
  1836. {$IFDEF UNICODE}
  1837. {$IFDEF DYNAMIC_LINK}
  1838. var
  1839.   _MsiConfigureProduct: Pointer;
  1840. function MsiConfigureProduct;
  1841. begin
  1842.   GetProcedureAddress(_MsiConfigureProduct, msilib, 'MsiConfigureProductW');
  1843.   asm
  1844.     mov esp, ebp
  1845.     pop ebp
  1846.     jmp [_MsiConfigureProduct]
  1847.   end;
  1848. end;
  1849. {$ELSE}
  1850. function MsiConfigureProduct; external msilib name 'MsiConfigureProductW';
  1851. {$ENDIF DYNAMIC_LINK}
  1852. {$ELSE}
  1853. {$IFDEF DYNAMIC_LINK}
  1854. var
  1855.   _MsiConfigureProduct: Pointer;
  1856. function MsiConfigureProduct;
  1857. begin
  1858.   GetProcedureAddress(_MsiConfigureProduct, msilib, 'MsiConfigureProductA');
  1859.   asm
  1860.     mov esp, ebp
  1861.     pop ebp
  1862.     jmp [_MsiConfigureProduct]
  1863.   end;
  1864. end;
  1865. {$ELSE}
  1866. function MsiConfigureProduct; external msilib name 'MsiConfigureProductA';
  1867. {$ENDIF DYNAMIC_LINK}
  1868. {$ENDIF}
  1869. {$IFDEF DYNAMIC_LINK}
  1870. var
  1871.   _MsiConfigureProductExA: Pointer;
  1872. function MsiConfigureProductExA;
  1873. begin
  1874.   GetProcedureAddress(_MsiConfigureProductExA, msilib, 'MsiConfigureProductExA');
  1875.   asm
  1876.     mov esp, ebp
  1877.     pop ebp
  1878.     jmp [_MsiConfigureProductExA]
  1879.   end;
  1880. end;
  1881. {$ELSE}
  1882. function MsiConfigureProductExA; external msilib name 'MsiConfigureProductExA';
  1883. {$ENDIF DYNAMIC_LINK}
  1884. {$IFDEF DYNAMIC_LINK}
  1885. var
  1886.   _MsiConfigureProductExW: Pointer;
  1887. function MsiConfigureProductExW;
  1888. begin
  1889.   GetProcedureAddress(_MsiConfigureProductExW, msilib, 'MsiConfigureProductExW');
  1890.   asm
  1891.     mov esp, ebp
  1892.     pop ebp
  1893.     jmp [_MsiConfigureProductExW]
  1894.   end;
  1895. end;
  1896. {$ELSE}
  1897. function MsiConfigureProductExW; external msilib name 'MsiConfigureProductExW';
  1898. {$ENDIF DYNAMIC_LINK}
  1899. {$IFDEF UNICODE}
  1900. {$IFDEF DYNAMIC_LINK}
  1901. var
  1902.   _MsiConfigureProductEx: Pointer;
  1903. function MsiConfigureProductEx;
  1904. begin
  1905.   GetProcedureAddress(_MsiConfigureProductEx, msilib, 'MsiConfigureProductExW');
  1906.   asm
  1907.     mov esp, ebp
  1908.     pop ebp
  1909.     jmp [_MsiConfigureProductEx]
  1910.   end;
  1911. end;
  1912. {$ELSE}
  1913. function MsiConfigureProductEx; external msilib name 'MsiConfigureProductExW';
  1914. {$ENDIF DYNAMIC_LINK}
  1915. {$ELSE}
  1916. {$IFDEF DYNAMIC_LINK}
  1917. var
  1918.   _MsiConfigureProductEx: Pointer;
  1919. function MsiConfigureProductEx;
  1920. begin
  1921.   GetProcedureAddress(_MsiConfigureProductEx, msilib, 'MsiConfigureProductExA');
  1922.   asm
  1923.     mov esp, ebp
  1924.     pop ebp
  1925.     jmp [_MsiConfigureProductEx]
  1926.   end;
  1927. end;
  1928. {$ELSE}
  1929. function MsiConfigureProductEx; external msilib name 'MsiConfigureProductExA';
  1930. {$ENDIF DYNAMIC_LINK}
  1931. {$ENDIF}
  1932. {$IFDEF DYNAMIC_LINK}
  1933. var
  1934.   _MsiReinstallProductA: Pointer;
  1935. function MsiReinstallProductA;
  1936. begin
  1937.   GetProcedureAddress(_MsiReinstallProductA, msilib, 'MsiReinstallProductA');
  1938.   asm
  1939.     mov esp, ebp
  1940.     pop ebp
  1941.     jmp [_MsiReinstallProductA]
  1942.   end;
  1943. end;
  1944. {$ELSE}
  1945. function MsiReinstallProductA; external msilib name 'MsiReinstallProductA';
  1946. {$ENDIF DYNAMIC_LINK}
  1947. {$IFDEF DYNAMIC_LINK}
  1948. var
  1949.   _MsiReinstallProductW: Pointer;
  1950. function MsiReinstallProductW;
  1951. begin
  1952.   GetProcedureAddress(_MsiReinstallProductW, msilib, 'MsiReinstallProductW');
  1953.   asm
  1954.     mov esp, ebp
  1955.     pop ebp
  1956.     jmp [_MsiReinstallProductW]
  1957.   end;
  1958. end;
  1959. {$ELSE}
  1960. function MsiReinstallProductW; external msilib name 'MsiReinstallProductW';
  1961. {$ENDIF DYNAMIC_LINK}
  1962. {$IFDEF UNICODE}
  1963. {$IFDEF DYNAMIC_LINK}
  1964. var
  1965.   _MsiReinstallProduct: Pointer;
  1966. function MsiReinstallProduct;
  1967. begin
  1968.   GetProcedureAddress(_MsiReinstallProduct, msilib, 'MsiReinstallProductW');
  1969.   asm
  1970.     mov esp, ebp
  1971.     pop ebp
  1972.     jmp [_MsiReinstallProduct]
  1973.   end;
  1974. end;
  1975. {$ELSE}
  1976. function MsiReinstallProduct; external msilib name 'MsiReinstallProductW';
  1977. {$ENDIF DYNAMIC_LINK}
  1978. {$ELSE}
  1979. {$IFDEF DYNAMIC_LINK}
  1980. var
  1981.   _MsiReinstallProduct: Pointer;
  1982. function MsiReinstallProduct;
  1983. begin
  1984.   GetProcedureAddress(_MsiReinstallProduct, msilib, 'MsiReinstallProductA');
  1985.   asm
  1986.     mov esp, ebp
  1987.     pop ebp
  1988.     jmp [_MsiReinstallProduct]
  1989.   end;
  1990. end;
  1991. {$ELSE}
  1992. function MsiReinstallProduct; external msilib name 'MsiReinstallProductA';
  1993. {$ENDIF DYNAMIC_LINK}
  1994. {$ENDIF}
  1995. {$IFDEF DYNAMIC_LINK}
  1996. var
  1997.   _MsiAdvertiseProductExA: Pointer;
  1998. function MsiAdvertiseProductExA;
  1999. begin
  2000.   GetProcedureAddress(_MsiAdvertiseProductExA, msilib, 'MsiAdvertiseProductExA');
  2001.   asm
  2002.     mov esp, ebp
  2003.     pop ebp
  2004.     jmp [_MsiAdvertiseProductExA]
  2005.   end;
  2006. end;
  2007. {$ELSE}
  2008. function MsiAdvertiseProductExA; external msilib name 'MsiAdvertiseProductExA';
  2009. {$ENDIF DYNAMIC_LINK}
  2010. {$IFDEF DYNAMIC_LINK}
  2011. var
  2012.   _MsiAdvertiseProductExW: Pointer;
  2013. function MsiAdvertiseProductExW;
  2014. begin
  2015.   GetProcedureAddress(_MsiAdvertiseProductExW, msilib, 'MsiAdvertiseProductExW');
  2016.   asm
  2017.     mov esp, ebp
  2018.     pop ebp
  2019.     jmp [_MsiAdvertiseProductExW]
  2020.   end;
  2021. end;
  2022. {$ELSE}
  2023. function MsiAdvertiseProductExW; external msilib name 'MsiAdvertiseProductExW';
  2024. {$ENDIF DYNAMIC_LINK}
  2025. {$IFDEF UNICODE}
  2026. {$IFDEF DYNAMIC_LINK}
  2027. var
  2028.   _MsiAdvertiseProductEx: Pointer;
  2029. function MsiAdvertiseProductEx;
  2030. begin
  2031.   GetProcedureAddress(_MsiAdvertiseProductEx, msilib, 'MsiAdvertiseProductExW');
  2032.   asm
  2033.     mov esp, ebp
  2034.     pop ebp
  2035.     jmp [_MsiAdvertiseProductEx]
  2036.   end;
  2037. end;
  2038. {$ELSE}
  2039. function MsiAdvertiseProductEx; external msilib name 'MsiAdvertiseProductExW';
  2040. {$ENDIF DYNAMIC_LINK}
  2041. {$ELSE}
  2042. {$IFDEF DYNAMIC_LINK}
  2043. var
  2044.   _MsiAdvertiseProductEx: Pointer;
  2045. function MsiAdvertiseProductEx;
  2046. begin
  2047.   GetProcedureAddress(_MsiAdvertiseProductEx, msilib, 'MsiAdvertiseProductExA');
  2048.   asm
  2049.     mov esp, ebp
  2050.     pop ebp
  2051.     jmp [_MsiAdvertiseProductEx]
  2052.   end;
  2053. end;
  2054. {$ELSE}
  2055. function MsiAdvertiseProductEx; external msilib name 'MsiAdvertiseProductExA';
  2056. {$ENDIF DYNAMIC_LINK}
  2057. {$ENDIF}
  2058. {$IFDEF DYNAMIC_LINK}
  2059. var
  2060.   _MsiAdvertiseProductA: Pointer;
  2061. function MsiAdvertiseProductA;
  2062. begin
  2063.   GetProcedureAddress(_MsiAdvertiseProductA, msilib, 'MsiAdvertiseProductA');
  2064.   asm
  2065.     mov esp, ebp
  2066.     pop ebp
  2067.     jmp [_MsiAdvertiseProductA]
  2068.   end;
  2069. end;
  2070. {$ELSE}
  2071. function MsiAdvertiseProductA; external msilib name 'MsiAdvertiseProductA';
  2072. {$ENDIF DYNAMIC_LINK}
  2073. {$IFDEF DYNAMIC_LINK}
  2074. var
  2075.   _MsiAdvertiseProductW: Pointer;
  2076. function MsiAdvertiseProductW;
  2077. begin
  2078.   GetProcedureAddress(_MsiAdvertiseProductW, msilib, 'MsiAdvertiseProductW');
  2079.   asm
  2080.     mov esp, ebp
  2081.     pop ebp
  2082.     jmp [_MsiAdvertiseProductW]
  2083.   end;
  2084. end;
  2085. {$ELSE}
  2086. function MsiAdvertiseProductW; external msilib name 'MsiAdvertiseProductW';
  2087. {$ENDIF DYNAMIC_LINK}
  2088. {$IFDEF UNICODE}
  2089. {$IFDEF DYNAMIC_LINK}
  2090. var
  2091.   _MsiAdvertiseProduct: Pointer;
  2092. function MsiAdvertiseProduct;
  2093. begin
  2094.   GetProcedureAddress(_MsiAdvertiseProduct, msilib, 'MsiAdvertiseProductW');
  2095.   asm
  2096.     mov esp, ebp
  2097.     pop ebp
  2098.     jmp [_MsiAdvertiseProduct]
  2099.   end;
  2100. end;
  2101. {$ELSE}
  2102. function MsiAdvertiseProduct; external msilib name 'MsiAdvertiseProductW';
  2103. {$ENDIF DYNAMIC_LINK}
  2104. {$ELSE}
  2105. {$IFDEF DYNAMIC_LINK}
  2106. var
  2107.   _MsiAdvertiseProduct: Pointer;
  2108. function MsiAdvertiseProduct;
  2109. begin
  2110.   GetProcedureAddress(_MsiAdvertiseProduct, msilib, 'MsiAdvertiseProductA');
  2111.   asm
  2112.     mov esp, ebp
  2113.     pop ebp
  2114.     jmp [_MsiAdvertiseProduct]
  2115.   end;
  2116. end;
  2117. {$ELSE}
  2118. function MsiAdvertiseProduct; external msilib name 'MsiAdvertiseProductA';
  2119. {$ENDIF DYNAMIC_LINK}
  2120. {$ENDIF}
  2121. {$IFDEF DYNAMIC_LINK}
  2122. var
  2123.   _MsiProcessAdvertiseScriptA: Pointer;
  2124. function MsiProcessAdvertiseScriptA;
  2125. begin
  2126.   GetProcedureAddress(_MsiProcessAdvertiseScriptA, msilib, 'MsiProcessAdvertiseScriptA');
  2127.   asm
  2128.     mov esp, ebp
  2129.     pop ebp
  2130.     jmp [_MsiProcessAdvertiseScriptA]
  2131.   end;
  2132. end;
  2133. {$ELSE}
  2134. function MsiProcessAdvertiseScriptA; external msilib name 'MsiProcessAdvertiseScriptA';
  2135. {$ENDIF DYNAMIC_LINK}
  2136. {$IFDEF DYNAMIC_LINK}
  2137. var
  2138.   _MsiProcessAdvertiseScriptW: Pointer;
  2139. function MsiProcessAdvertiseScriptW;
  2140. begin
  2141.   GetProcedureAddress(_MsiProcessAdvertiseScriptW, msilib, 'MsiProcessAdvertiseScriptW');
  2142.   asm
  2143.     mov esp, ebp
  2144.     pop ebp
  2145.     jmp [_MsiProcessAdvertiseScriptW]
  2146.   end;
  2147. end;
  2148. {$ELSE}
  2149. function MsiProcessAdvertiseScriptW; external msilib name 'MsiProcessAdvertiseScriptW';
  2150. {$ENDIF DYNAMIC_LINK}
  2151. {$IFDEF UNICODE}
  2152. {$IFDEF DYNAMIC_LINK}
  2153. var
  2154.   _MsiProcessAdvertiseScript: Pointer;
  2155. function MsiProcessAdvertiseScript;
  2156. begin
  2157.   GetProcedureAddress(_MsiProcessAdvertiseScript, msilib, 'MsiProcessAdvertiseScriptW');
  2158.   asm
  2159.     mov esp, ebp
  2160.     pop ebp
  2161.     jmp [_MsiProcessAdvertiseScript]
  2162.   end;
  2163. end;
  2164. {$ELSE}
  2165. function MsiProcessAdvertiseScript; external msilib name 'MsiProcessAdvertiseScriptW';
  2166. {$ENDIF DYNAMIC_LINK}
  2167. {$ELSE}
  2168. {$IFDEF DYNAMIC_LINK}
  2169. var
  2170.   _MsiProcessAdvertiseScript: Pointer;
  2171. function MsiProcessAdvertiseScript;
  2172. begin
  2173.   GetProcedureAddress(_MsiProcessAdvertiseScript, msilib, 'MsiProcessAdvertiseScriptA');
  2174.   asm
  2175.     mov esp, ebp
  2176.     pop ebp
  2177.     jmp [_MsiProcessAdvertiseScript]
  2178.   end;
  2179. end;
  2180. {$ELSE}
  2181. function MsiProcessAdvertiseScript; external msilib name 'MsiProcessAdvertiseScriptA';
  2182. {$ENDIF DYNAMIC_LINK}
  2183. {$ENDIF}
  2184. {$IFDEF DYNAMIC_LINK}
  2185. var
  2186.   _MsiAdvertiseScriptA: Pointer;
  2187. function MsiAdvertiseScriptA;
  2188. begin
  2189.   GetProcedureAddress(_MsiAdvertiseScriptA, msilib, 'MsiAdvertiseScriptA');
  2190.   asm
  2191.     mov esp, ebp
  2192.     pop ebp
  2193.     jmp [_MsiAdvertiseScriptA]
  2194.   end;
  2195. end;
  2196. {$ELSE}
  2197. function MsiAdvertiseScriptA; external msilib name 'MsiAdvertiseScriptA';
  2198. {$ENDIF DYNAMIC_LINK}
  2199. {$IFDEF DYNAMIC_LINK}
  2200. var
  2201.   _MsiAdvertiseScriptW: Pointer;
  2202. function MsiAdvertiseScriptW;
  2203. begin
  2204.   GetProcedureAddress(_MsiAdvertiseScriptW, msilib, 'MsiAdvertiseScriptW');
  2205.   asm
  2206.     mov esp, ebp
  2207.     pop ebp
  2208.     jmp [_MsiAdvertiseScriptW]
  2209.   end;
  2210. end;
  2211. {$ELSE}
  2212. function MsiAdvertiseScriptW; external msilib name 'MsiAdvertiseScriptW';
  2213. {$ENDIF DYNAMIC_LINK}
  2214. {$IFDEF UNICODE}
  2215. {$IFDEF DYNAMIC_LINK}
  2216. var
  2217.   _MsiAdvertiseScript: Pointer;
  2218. function MsiAdvertiseScript;
  2219. begin
  2220.   GetProcedureAddress(_MsiAdvertiseScript, msilib, 'MsiAdvertiseScriptW');
  2221.   asm
  2222.     mov esp, ebp
  2223.     pop ebp
  2224.     jmp [_MsiAdvertiseScript]
  2225.   end;
  2226. end;
  2227. {$ELSE}
  2228. function MsiAdvertiseScript; external msilib name 'MsiAdvertiseScriptW';
  2229. {$ENDIF DYNAMIC_LINK}
  2230. {$ELSE}
  2231. {$IFDEF DYNAMIC_LINK}
  2232. var
  2233.   _MsiAdvertiseScript: Pointer;
  2234. function MsiAdvertiseScript;
  2235. begin
  2236.   GetProcedureAddress(_MsiAdvertiseScript, msilib, 'MsiAdvertiseScriptA');
  2237.   asm
  2238.     mov esp, ebp
  2239.     pop ebp
  2240.     jmp [_MsiAdvertiseScript]
  2241.   end;
  2242. end;
  2243. {$ELSE}
  2244. function MsiAdvertiseScript; external msilib name 'MsiAdvertiseScriptA';
  2245. {$ENDIF DYNAMIC_LINK}
  2246. {$ENDIF}
  2247. {$IFDEF DYNAMIC_LINK}
  2248. var
  2249.   _MsiGetProductInfoFromScriptA: Pointer;
  2250. function MsiGetProductInfoFromScriptA;
  2251. begin
  2252.   GetProcedureAddress(_MsiGetProductInfoFromScriptA, msilib, 'MsiGetProductInfoFromScriptA');
  2253.   asm
  2254.     mov esp, ebp
  2255.     pop ebp
  2256.     jmp [_MsiGetProductInfoFromScriptA]
  2257.   end;
  2258. end;
  2259. {$ELSE}
  2260. function MsiGetProductInfoFromScriptA; external msilib name 'MsiGetProductInfoFromScriptA';
  2261. {$ENDIF DYNAMIC_LINK}
  2262. {$IFDEF DYNAMIC_LINK}
  2263. var
  2264.   _MsiGetProductInfoFromScriptW: Pointer;
  2265. function MsiGetProductInfoFromScriptW;
  2266. begin
  2267.   GetProcedureAddress(_MsiGetProductInfoFromScriptW, msilib, 'MsiGetProductInfoFromScriptW');
  2268.   asm
  2269.     mov esp, ebp
  2270.     pop ebp
  2271.     jmp [_MsiGetProductInfoFromScriptW]
  2272.   end;
  2273. end;
  2274. {$ELSE}
  2275. function MsiGetProductInfoFromScriptW; external msilib name 'MsiGetProductInfoFromScriptW';
  2276. {$ENDIF DYNAMIC_LINK}
  2277. {$IFDEF UNICODE}
  2278. {$IFDEF DYNAMIC_LINK}
  2279. var
  2280.   _MsiGetProductInfoFromScript: Pointer;
  2281. function MsiGetProductInfoFromScript;
  2282. begin
  2283.   GetProcedureAddress(_MsiGetProductInfoFromScript, msilib, 'MsiGetProductInfoFromScriptW');
  2284.   asm
  2285.     mov esp, ebp
  2286.     pop ebp
  2287.     jmp [_MsiGetProductInfoFromScript]
  2288.   end;
  2289. end;
  2290. {$ELSE}
  2291. function MsiGetProductInfoFromScript; external msilib name 'MsiGetProductInfoFromScriptW';
  2292. {$ENDIF DYNAMIC_LINK}
  2293. {$ELSE}
  2294. {$IFDEF DYNAMIC_LINK}
  2295. var
  2296.   _MsiGetProductInfoFromScript: Pointer;
  2297. function MsiGetProductInfoFromScript;
  2298. begin
  2299.   GetProcedureAddress(_MsiGetProductInfoFromScript, msilib, 'MsiGetProductInfoFromScriptA');
  2300.   asm
  2301.     mov esp, ebp
  2302.     pop ebp
  2303.     jmp [_MsiGetProductInfoFromScript]
  2304.   end;
  2305. end;
  2306. {$ELSE}
  2307. function MsiGetProductInfoFromScript; external msilib name 'MsiGetProductInfoFromScriptA';
  2308. {$ENDIF DYNAMIC_LINK}
  2309. {$ENDIF}
  2310. {$IFDEF DYNAMIC_LINK}
  2311. var
  2312.   _MsiGetProductCodeA: Pointer;
  2313. function MsiGetProductCodeA;
  2314. begin
  2315.   GetProcedureAddress(_MsiGetProductCodeA, msilib, 'MsiGetProductCodeA');
  2316.   asm
  2317.     mov esp, ebp
  2318.     pop ebp
  2319.     jmp [_MsiGetProductCodeA]
  2320.   end;
  2321. end;
  2322. {$ELSE}
  2323. function MsiGetProductCodeA; external msilib name 'MsiGetProductCodeA';
  2324. {$ENDIF DYNAMIC_LINK}
  2325. {$IFDEF DYNAMIC_LINK}
  2326. var
  2327.   _MsiGetProductCodeW: Pointer;
  2328. function MsiGetProductCodeW;
  2329. begin
  2330.   GetProcedureAddress(_MsiGetProductCodeW, msilib, 'MsiGetProductCodeW');
  2331.   asm
  2332.     mov esp, ebp
  2333.     pop ebp
  2334.     jmp [_MsiGetProductCodeW]
  2335.   end;
  2336. end;
  2337. {$ELSE}
  2338. function MsiGetProductCodeW; external msilib name 'MsiGetProductCodeW';
  2339. {$ENDIF DYNAMIC_LINK}
  2340. {$IFDEF UNICODE}
  2341. {$IFDEF DYNAMIC_LINK}
  2342. var
  2343.   _MsiGetProductCode: Pointer;
  2344. function MsiGetProductCode;
  2345. begin
  2346.   GetProcedureAddress(_MsiGetProductCode, msilib, 'MsiGetProductCodeW');
  2347.   asm
  2348.     mov esp, ebp
  2349.     pop ebp
  2350.     jmp [_MsiGetProductCode]
  2351.   end;
  2352. end;
  2353. {$ELSE}
  2354. function MsiGetProductCode; external msilib name 'MsiGetProductCodeW';
  2355. {$ENDIF DYNAMIC_LINK}
  2356. {$ELSE}
  2357. {$IFDEF DYNAMIC_LINK}
  2358. var
  2359.   _MsiGetProductCode: Pointer;
  2360. function MsiGetProductCode;
  2361. begin
  2362.   GetProcedureAddress(_MsiGetProductCode, msilib, 'MsiGetProductCodeA');
  2363.   asm
  2364.     mov esp, ebp
  2365.     pop ebp
  2366.     jmp [_MsiGetProductCode]
  2367.   end;
  2368. end;
  2369. {$ELSE}
  2370. function MsiGetProductCode; external msilib name 'MsiGetProductCodeA';
  2371. {$ENDIF DYNAMIC_LINK}
  2372. {$ENDIF}
  2373. {$IFDEF DYNAMIC_LINK}
  2374. var
  2375.   _MsiGetUserInfoA: Pointer;
  2376. function MsiGetUserInfoA;
  2377. begin
  2378.   GetProcedureAddress(_MsiGetUserInfoA, msilib, 'MsiGetUserInfoA');
  2379.   asm
  2380.     mov esp, ebp
  2381.     pop ebp
  2382.     jmp [_MsiGetUserInfoA]
  2383.   end;
  2384. end;
  2385. {$ELSE}
  2386. function MsiGetUserInfoA; external msilib name 'MsiGetUserInfoA';
  2387. {$ENDIF DYNAMIC_LINK}
  2388. {$IFDEF DYNAMIC_LINK}
  2389. var
  2390.   _MsiGetUserInfoW: Pointer;
  2391. function MsiGetUserInfoW;