/*****************************************************************************\ * * * msi.h - - Interface for external access to Installer Service * * * * Version 0.20 * * * * NOTES: All buffers sizes are TCHAR count, null included only on input * * Return argument pointers may be null if not interested in value * * * * Copyright (c) 1997, Microsoft Corp. All rights reserved. * * * \*****************************************************************************/ #ifndef _MSI_H_ #define _MSI_H_ // -------------------------------------------------------------------------- // Installer generic handle definitions // -------------------------------------------------------------------------- typedef unsigned long MSIHANDLE; // abstract generic handle, 0 == no handle #ifdef __cplusplus extern "C" { #endif // Close a open handle of any type // All handles obtained from API calls must be closed when no longer needed // Normally succeeds, returning TRUE. UINT WINAPI MsiCloseHandle(MSIHANDLE hAny); // Close all handles open in the process, a diagnostic call // This should NOT be used as a cleanup mechanism -- use PMSIHANDLE class // Can be called at termination to assure that all handles have been closed // Returns 0 if all handles have been close, else number of open handles UINT WINAPI MsiCloseAllHandles(); #ifdef __cplusplus } #endif #ifdef __cplusplus // C++ wrapper object to automatically free handle when going out of scope class PMSIHANDLE { MSIHANDLE m_h; public: PMSIHANDLE():m_h(0){} PMSIHANDLE(MSIHANDLE h):m_h(h){} ~PMSIHANDLE(){if (m_h!=0) MsiCloseHandle(m_h);} void operator =(MSIHANDLE h) {if (m_h) MsiCloseHandle(m_h); m_h=h;} operator MSIHANDLE() {return m_h;} MSIHANDLE* operator &() {if (m_h) MsiCloseHandle(m_h); m_h = 0; return &m_h;} }; #endif //__cplusplus // Install message type for callback is a combination of the following: // A message box style: MB_*, where MB_OK is the default // A message box icon type: MB_ICON*, where no icon is the default // A default button: MB_DEFBUTTON?, where MB_DEFBUTTON1 is the default // One of the following install message types, no default typedef enum tagINSTALLMESSAGE { INSTALLMESSAGE_OUTOFMEMORY = 0x00000000L, // out of memory message INSTALLMESSAGE_ERROR = 0x01000000L, // formatted error message INSTALLMESSAGE_WARNING = 0x02000000L, // formatted warning message INSTALLMESSAGE_USER = 0x03000000L, // user request message INSTALLMESSAGE_INFO = 0x04000000L, // informative message for log INSTALLMESSAGE_DIAGNOSTIC = 0x05000000L, // debug notification, display if no log INSTALLMESSAGE_COMMONDATA = 0x06000000L, // product info for dialog: language Id, dialog caption INSTALLMESSAGE_RESERVED = 0x07000000L, // reserved for future use INSTALLMESSAGE_ACTIONSTART = 0x08000000L, // start of action: action name & description INSTALLMESSAGE_ACTIONDATA = 0x09000000L, // formatted data associated with individual action item INSTALLMESSAGE_PROGRESS = 0x0A000000L, // progress gauge info: units so far, total INSTALLMESSAGE_ACTIONDONE = 0x0B000000L, // end of action sequence, exit modeless dialog } INSTALLMESSAGE; // external error handler supplied to installation API functions typedef int (*INSTALLUI_HANDLERA)(LPVOID pvContext, UINT iMessageType, LPCSTR szMessage); typedef int (*INSTALLUI_HANDLERW)(LPVOID pvContext, UINT iMessageType, LPCWSTR szMessage); #ifdef UNICODE #define INSTALLUI_HANDLER INSTALLUI_HANDLERW #else #define INSTALLUI_HANDLER INSTALLUI_HANDLERA #endif // !UNICODE typedef enum tagINSTALLUILEVEL { INSTALLUILEVEL_NOCHANGE = 0, // UI level is unchanged INSTALLUILEVEL_DEFAULT = 1, // default UI is used INSTALLUILEVEL_NONE = 2, // completely silent installation INSTALLUILEVEL_BASIC = 3, // simple progress and error handling INSTALLUILEVEL_REDUCED = 4, // authored UI, wizard dialogs suppressed INSTALLUILEVEL_FULL = 5, // authored UI with wizards, progress, errors } INSTALLUILEVEL; typedef enum tagINSTALLSTATE { INSTALLSTATE_BADCONFIG = -6, // configuration data corrupt INSTALLSTATE_INCOMPLETE = -5, // installation suspended or in progress INSTALLSTATE_SOURCEABSENT = -4, // run from source, source is unavailable INSTALLSTATE_MOREDATA = -3, // return buffer overflow INSTALLSTATE_INVALIDARG = -2, // invalid function argument INSTALLSTATE_UNKNOWN = -1, // unrecognized product or feature INSTALLSTATE_BROKEN = 0, // broken INSTALLSTATE_ADVERTISED = 1, // advertised INSTALLSTATE_ABSENT = 2, // uninstalled INSTALLSTATE_LOCAL = 3, // installed on local drive INSTALLSTATE_SOURCE = 4, // run from source, CD or net INSTALLSTATE_DEFAULT = 5, // use default, local or source } INSTALLSTATE; typedef enum tagUSERINFOSTATE { USERINFOSTATE_MOREDATA = -3, // return buffer overflow USERINFOSTATE_INVALIDARG = -2, // invalid function argument USERINFOSTATE_UNKNOWN = -1, // unrecognized product USERINFOSTATE_ABSENT = 0, // user info and PID not initialized USERINFOSTATE_PRESENT = 1, // user info and PID initialized } USERINFOSTATE; typedef enum tagINSTALLLEVEL { INSTALLLEVEL_DEFAULT = 0, // install authored default INSTALLLEVEL_MINIMUM = 1, // install only required features INSTALLLEVEL_MAXIMUM = 0xFFFF, // install all features } INSTALLLEVEL; // intermediate levels dependent on authoring typedef enum tagREINSTALLMODE // bit flags { REINSTALLMODE_REPAIR = 0x00000001, // repair any defects encountered REINSTALLMODE_FILEMISSING = 0x00000002, // Reinstall only if file is missing REINSTALLMODE_FILEOLDERVERSION = 0x00000004, // Reinstall if file is missing, or older version REINSTALLMODE_FILEEQUALVERSION = 0x00000008, // Reinstall if file is missing, or equal or older version REINSTALLMODE_FILEEXACT = 0x00000010, // Reinstall if file is missing, or not exact version REINSTALLMODE_FILEVERIFY = 0x00000020, // checksum executables, reinstall if missing or corrupt REINSTALLMODE_FILEREPLACE = 0x00000040, // Reinstall all files, regardless of version REINSTALLMODE_MACHINEDATA = 0x00000080, // insure required machine reg entries REINSTALLMODE_USERDATA = 0x00000100, // insure required user reg entries REINSTALLMODE_SHORTCUT = 0x00000200, // validate shortcuts and progman items } REINSTALLMODE; typedef enum tagINSTALLOGMODE // bit flags { INSTALLLOGMODE_OUTOFMEMORY = (1 << (INSTALLMESSAGE_OUTOFMEMORY >> 24)), INSTALLLOGMODE_ERROR = (1 << (INSTALLMESSAGE_ERROR >> 24)), INSTALLLOGMODE_WARNING = (1 << (INSTALLMESSAGE_WARNING >> 24)), INSTALLLOGMODE_USER = (1 << (INSTALLMESSAGE_USER >> 24)), INSTALLLOGMODE_INFO = (1 << (INSTALLMESSAGE_INFO >> 24)), INSTALLLOGMODE_DIAGNOSTIC = (1 << (INSTALLMESSAGE_DIAGNOSTIC >> 24)), INSTALLLOGMODE_COMMONDATA = (1 << (INSTALLMESSAGE_COMMONDATA >> 24)), INSTALLLOGMODE_RESERVED = (1 << (INSTALLMESSAGE_RESERVED >> 24)), INSTALLLOGMODE_ACTIONSTART = (1 << (INSTALLMESSAGE_ACTIONSTART >> 24)), INSTALLLOGMODE_ACTIONDATA = (1 << (INSTALLMESSAGE_ACTIONDATA >> 24)), INSTALLLOGMODE_PROPERTYDUMP = (1 << (INSTALLMESSAGE_PROGRESS >> 24)), } INSTALLLOGMODE; typedef enum tagINSTALLFEATUREATTRIBUTE // bit flags { INSTALLFEATUREATTRIBUTE_FAVORLOCAL = 0x00000001, INSTALLFEATUREATTRIBUTE_FAVORSOURCE = 0x00000002, INSTALLFEATUREATTRIBUTE_FOLLOWPARENT = 0x00000004, } INSTALLFEATUREATTRIBUTE; typedef enum tagINSTALLSOURCEACTION { INSTALLSOURCEACTION_ADD = 1, // add source to list INSTALLSOURCEACTION_REMOVE = 2, // remove source from list INSTALLSOURCEACTION_REMOVEALL = 3, // flush entire sourcelist key INSTALLSOURCEACTION_REMOVEALLNET = 4, // flush all network sources INSTALLSOURCEACTION_REMOVEALLURL = 5, // flush all URL sources INSTALLSOURCEACTION_ENABLECD = 6, // enable searching on CD sources INSTALLSOURCEACTION_DISABLECD = 7, // disable searching on CD sources } INSTALLSOURCEACTION; #define MAX_FEATURE_CHARS 38 // maximum chars in feature name (same as string GUID) // Product info attributes: advertised information #define INSTALLPROPERTY_TRANSFORMS __TEXT("Transforms") #define INSTALLPROPERTY_LANGUAGE __TEXT("Language") #define INSTALLPROPERTY_PRODUCTNAME __TEXT("ProductName") // Product info attributes: installed information #define INSTALLPROPERTY_INSTALLEDPRODUCTNAME __TEXT("InstalledProductName") #define INSTALLPROPERTY_VERSIONSTRING __TEXT("VersionString") #define INSTALLPROPERTY_HELPLINK __TEXT("HelpLink") #define INSTALLPROPERTY_HELPTELEPHONE __TEXT("HelpTelephone") #define INSTALLPROPERTY_INSTALLLOCATION __TEXT("InstallLocation") #define INSTALLPROPERTY_INSTALLSOURCE __TEXT("InstallSource") #define INSTALLPROPERTY_INSTALLDATE __TEXT("InstallDate") #define INSTALLPROPERTY_PUBLISHER __TEXT("Publisher") #define INSTALLPROPERTY_LOCALPACKAGE __TEXT("LocalPackage") #define INSTALLPROPERTY_URLINFOABOUT __TEXT("URLInfoAbout") #define INSTALLPROPERTY_URLUPDATEINFO __TEXT("URLUpdateInfo") #define INSTALLPROPERTY_VERSIONMINOR __TEXT("VersionMinor") #define INSTALLPROPERTY_VERSIONMAJOR __TEXT("VersionMajor") #ifdef __cplusplus extern "C" { #endif // -------------------------------------------------------------------------- // Functions to set the UI handling and logging. The UI will be used for error, // progress, and log messages for all subsequent calls to Installer Service // API functions that require UI. // -------------------------------------------------------------------------- // Enable internal UI INSTALLUILEVEL WINAPI MsiSetInternalUI( INSTALLUILEVEL dwUILevel, // UI level HWND *phWnd); // handle of owner window // Enable external UI INSTALLUI_HANDLERA WINAPI MsiSetExternalUIA( INSTALLUI_HANDLERA puiHandler, // for progress and error handling DWORD dwMessageFilter, // bit flags designating messages to handle LPVOID pvContext); // application context INSTALLUI_HANDLERW WINAPI MsiSetExternalUIW( INSTALLUI_HANDLERW puiHandler, // for progress and error handling DWORD dwMessageFilter, // bit flags designating messages to handle LPVOID pvContext); // application context #ifdef UNICODE #define MsiSetExternalUI MsiSetExternalUIW #else #define MsiSetExternalUI MsiSetExternalUIA #endif // !UNICODE // Enable logging to a file or extern UI handler for the client process, // with control over which log messages are passed to the file or handler UINT WINAPI MsiEnableLogA( DWORD dwLogMode, // bit flags designating operations to report LPCSTR szLogFile, // log file, or NULL to direct to external handler BOOL fAppend); // TRUE to append to existing file, FALSE to replace UINT WINAPI MsiEnableLogW( DWORD dwLogMode, // bit flags designating operations to report LPCWSTR szLogFile, // log file, or NULL to direct to external handler BOOL fAppend); // TRUE to append to existing file, FALSE to replace #ifdef UNICODE #define MsiEnableLog MsiEnableLogW #else #define MsiEnableLog MsiEnableLogA #endif // !UNICODE // -------------------------------------------------------------------------- // Functions to query and configure a product as a whole. // A component descriptor string may be used instead of the product code. // -------------------------------------------------------------------------- // Return the installed state for a product INSTALLSTATE WINAPI MsiQueryProductStateA( LPCSTR szProduct); INSTALLSTATE WINAPI MsiQueryProductStateW( LPCWSTR szProduct); #ifdef UNICODE #define MsiQueryProductState MsiQueryProductStateW #else #define MsiQueryProductState MsiQueryProductStateA #endif // !UNICODE // Return product info UINT WINAPI MsiGetProductInfoA( LPCSTR szProduct, // product code, string GUID, or descriptor LPCSTR szAttribute, // attribute name, case-sensitive LPSTR lpValueBuf, // returned value, NULL if not desired DWORD *pcchValueBuf); // in/out buffer character count UINT WINAPI MsiGetProductInfoW( LPCWSTR szProduct, // product code, string GUID, or descriptor LPCWSTR szAttribute, // attribute name, case-sensitive LPWSTR lpValueBuf, // returned value, NULL if not desired DWORD *pcchValueBuf); // in/out buffer character count #ifdef UNICODE #define MsiGetProductInfo MsiGetProductInfoW #else #define MsiGetProductInfo MsiGetProductInfoA #endif // !UNICODE // Install a new product. // Either may be NULL, but the DATABASE property must be specfied UINT WINAPI MsiInstallProductA( LPCSTR szPackagePath, // location of package to install LPCSTR szCommandLine); // command line UINT WINAPI MsiInstallProductW( LPCWSTR szPackagePath, // location of package to install LPCWSTR szCommandLine); // command line #ifdef UNICODE #define MsiInstallProduct MsiInstallProductW #else #define MsiInstallProduct MsiInstallProductA #endif // !UNICODE // Install/uninstall an advertised or installed product // No action if installed and INSTALLSTATE_DEFAULT specified UINT WINAPI MsiConfigureProductA( LPCSTR szProduct, // product code OR descriptor int iInstallLevel, // how much of the product to install INSTALLSTATE eInstallState); // local/source/default/absent/lock/uncache UINT WINAPI MsiConfigureProductW( LPCWSTR szProduct, // product code OR descriptor int iInstallLevel, // how much of the product to install INSTALLSTATE eInstallState); // local/source/default/absent/lock/uncache #ifdef UNICODE #define MsiConfigureProduct MsiConfigureProductW #else #define MsiConfigureProduct MsiConfigureProductA #endif // !UNICODE // Reinstall product, used to validate or correct problems UINT WINAPI MsiReinstallProductA( LPCSTR szProduct, // product code OR descriptor DWORD szReinstallMode); // one or more REINSTALLMODE modes UINT WINAPI MsiReinstallProductW( LPCWSTR szProduct, // product code OR descriptor DWORD szReinstallMode); // one or more REINSTALLMODE modes #ifdef UNICODE #define MsiReinstallProduct MsiReinstallProductW #else #define MsiReinstallProduct MsiReinstallProductA #endif // !UNICODE // Return the product code for a registered component, called once by apps UINT WINAPI MsiGetProductCodeA( LPCSTR szComponent, // component Id registered for this product LPSTR lpBuf39); // returned string GUID, sized for 39 characters UINT WINAPI MsiGetProductCodeW( LPCWSTR szComponent, // component Id registered for this product LPWSTR lpBuf39); // returned string GUID, sized for 39 characters #ifdef UNICODE #define MsiGetProductCode MsiGetProductCodeW #else #define MsiGetProductCode MsiGetProductCodeA #endif // !UNICODE // Return the registered user information for an installed product USERINFOSTATE WINAPI MsiGetUserInfoA( LPCSTR szProduct, // product code, string GUID LPSTR lpUserNameBuf, // return user name DWORD *pcchUserNameBuf, // in/out buffer character count LPSTR lpOrgNameBuf, // return company name DWORD *pcchOrgNameBuf, // in/out buffer character count LPSTR lpSerialBuf, // return product serial number DWORD *pcchSerialBuf); // in/out buffer character count USERINFOSTATE WINAPI MsiGetUserInfoW( LPCWSTR szProduct, // product code, string GUID LPWSTR lpUserNameBuf, // return user name DWORD *pcchUserNameBuf, // in/out buffer character count LPWSTR lpOrgNameBuf, // return company name DWORD *pcchOrgNameBuf, // in/out buffer character count LPWSTR lpSerialBuf, // return product serial number DWORD *pcchSerialBuf); // in/out buffer character count #ifdef UNICODE #define MsiGetUserInfo MsiGetUserInfoW #else #define MsiGetUserInfo MsiGetUserInfoA #endif // !UNICODE // Obtain and store user info and PID from installation wizard (first run) UINT WINAPI MsiCollectUserInfoA( LPCSTR szProduct); // product code, string GUID UINT WINAPI MsiCollectUserInfoW( LPCWSTR szProduct); // product code, string GUID #ifdef UNICODE #define MsiCollectUserInfo MsiCollectUserInfoW #else #define MsiCollectUserInfo MsiCollectUserInfoA #endif // !UNICODE // -------------------------------------------------------------------------- // Functions to query and configure a feature within a product. // Separate wrapper functions are provided that accept a descriptor string. // -------------------------------------------------------------------------- // Return the installed state for a product feature INSTALLSTATE WINAPI MsiQueryFeatureStateA( LPCSTR szProduct, LPCSTR szFeature); INSTALLSTATE WINAPI MsiQueryFeatureStateW( LPCWSTR szProduct, LPCWSTR szFeature); #ifdef UNICODE #define MsiQueryFeatureState MsiQueryFeatureStateW #else #define MsiQueryFeatureState MsiQueryFeatureStateA #endif // !UNICODE // Indicate intent to use a product feature, increments usage count // Prompts for CD if not loaded, does not install feature INSTALLSTATE WINAPI MsiUseFeatureA( LPCSTR szProduct, LPCSTR szFeature); INSTALLSTATE WINAPI MsiUseFeatureW( LPCWSTR szProduct, LPCWSTR szFeature); #ifdef UNICODE #define MsiUseFeature MsiUseFeatureW #else #define MsiUseFeature MsiUseFeatureA #endif // !UNICODE // Return the usage metrics for a product feature UINT WINAPI MsiGetFeatureUsageA( LPCSTR szProduct, // product code LPCSTR szFeature, // feature ID DWORD *pdwUseCount, // returned use count WORD *pwDateUsed); // last date used (DOS date format) UINT WINAPI MsiGetFeatureUsageW( LPCWSTR szProduct, // product code LPCWSTR szFeature, // feature ID DWORD *pdwUseCount, // returned use count WORD *pwDateUsed); // last date used (DOS date format) #ifdef UNICODE #define MsiGetFeatureUsage MsiGetFeatureUsageW #else #define MsiGetFeatureUsage MsiGetFeatureUsageA #endif // !UNICODE // Force the installed state for a product feature UINT WINAPI MsiConfigureFeatureA( LPCSTR szProduct, LPCSTR szFeature, INSTALLSTATE eInstallState); // local/source/default/absent/lock/uncache UINT WINAPI MsiConfigureFeatureW( LPCWSTR szProduct, LPCWSTR szFeature, INSTALLSTATE eInstallState); // local/source/default/absent/lock/uncache #ifdef UNICODE #define MsiConfigureFeature MsiConfigureFeatureW #else #define MsiConfigureFeature MsiConfigureFeatureA #endif // !UNICODE // Reinstall feature, used to validate or correct problems UINT WINAPI MsiReinstallFeatureA( LPCSTR szProduct, // product code LPCSTR szFeature, // feature ID, NULL for entire product DWORD dwReinstallMode); // one or more REINSTALLMODE modes UINT WINAPI MsiReinstallFeatureW( LPCWSTR szProduct, // product code LPCWSTR szFeature, // feature ID, NULL for entire product DWORD dwReinstallMode); // one or more REINSTALLMODE modes #ifdef UNICODE #define MsiReinstallFeature MsiReinstallFeatureW #else #define MsiReinstallFeature MsiReinstallFeatureA #endif // !UNICODE // -------------------------------------------------------------------------- // Functions to return a path to a particular component. // The state of the feature being used should have been checked previously. // -------------------------------------------------------------------------- // Return full path to an installed component INSTALLSTATE WINAPI MsiLocateComponentA( LPCSTR szComponent, // component Id, string GUID LPSTR lpPathBuf, // returned path DWORD *pcchBuf); // in/out buffer character count INSTALLSTATE WINAPI MsiLocateComponentW( LPCWSTR szComponent, // component Id, string GUID LPWSTR lpPathBuf, // returned path DWORD *pcchBuf); // in/out buffer character count #ifdef UNICODE #define MsiLocateComponent MsiLocateComponentW #else #define MsiLocateComponent MsiLocateComponentA #endif // !UNICODE // Return full component path, performing any necessary installation // calls MsiQueryFeatureState to detect that all components are installed // then calls MsiConfigureFeature if any of its components are uninstalled // then calls MsiLocateComponent to obtain the path the its key file UINT WINAPI MsiProvideComponentA( LPCSTR szProduct, // product code in case install required LPCSTR szFeature, // feature ID in case install required LPCSTR szComponent, // component ID DWORD dwReserved, // reserved, must be 0 LPSTR lpPathBuf, // returned path, NULL if not desired DWORD *pcchPathBuf);// in/out buffer character count UINT WINAPI MsiProvideComponentW( LPCWSTR szProduct, // product code in case install required LPCWSTR szFeature, // feature ID in case install required LPCWSTR szComponent, // component ID DWORD dwReserved, // reserved, must be 0 LPWSTR lpPathBuf, // returned path, NULL if not desired DWORD *pcchPathBuf);// in/out buffer character count #ifdef UNICODE #define MsiProvideComponent MsiProvideComponentW #else #define MsiProvideComponent MsiProvideComponentA #endif // !UNICODE // For an advertised component that registers descriptor strings, // return full component path, performing any necessary installation. // If the qualifier is NULL the default component, if present, will // be provided. Calls MsiProvideComponentFromDescriptor to install // and return the path. UINT WINAPI MsiProvideQualifiedComponentA( LPCSTR szCategory, // component category ID LPCSTR szQualifier, // specifies which component to access DWORD dwReserved, // reserved, must be 0 LPSTR lpPathBuf, // returned path, NULL if not desired DWORD *pcchPathBuf); // in/out buffer character count UINT WINAPI MsiProvideQualifiedComponentW( LPCWSTR szCategory, // component category ID LPCWSTR szQualifier, // specifies which component to access DWORD dwReserved, // reserved, must be 0 LPWSTR lpPathBuf, // returned path, NULL if not desired DWORD *pcchPathBuf); // in/out buffer character count #ifdef UNICODE #define MsiProvideQualifiedComponent MsiProvideQualifiedComponentW #else #define MsiProvideQualifiedComponent MsiProvideQualifiedComponentA #endif // !UNICODE // -------------------------------------------------------------------------- // Functions to iterate registered products, features, and components. // As with reg keys, they accept a 0-based index into the enumeration. // -------------------------------------------------------------------------- // Enumerate the registered products, either installed or advertised UINT WINAPI MsiEnumProductsA( DWORD iProductIndex, // 0-based index into registered products LPSTR lpProductBuf); // buffer of char count: 39 (size of string GUID) UINT WINAPI MsiEnumProductsW( DWORD iProductIndex, // 0-based index into registered products LPWSTR lpProductBuf); // buffer of char count: 39 (size of string GUID) #ifdef UNICODE #define MsiEnumProducts MsiEnumProductsW #else #define MsiEnumProducts MsiEnumProductsA #endif // !UNICODE // Enumerate the advertised features for a given product. // If parent is not required, supplying NULL will improve performance. UINT WINAPI MsiEnumFeaturesA( LPCSTR szProduct, DWORD iFeatureIndex, // 0-based index into published features LPSTR lpFeatureBuf, // feature name buffer, size=MAX_FEATURE_CHARS+1 LPSTR lpParentBuf); // parent feature buffer, size=MAX_FEATURE_CHARS+1 UINT WINAPI MsiEnumFeaturesW( LPCWSTR szProduct, DWORD iFeatureIndex, // 0-based index into published features LPWSTR lpFeatureBuf, // feature name buffer, size=MAX_FEATURE_CHARS+1 LPWSTR lpParentBuf); // parent feature buffer, size=MAX_FEATURE_CHARS+1 #ifdef UNICODE #define MsiEnumFeatures MsiEnumFeaturesW #else #define MsiEnumFeatures MsiEnumFeaturesA #endif // !UNICODE // Enumerate the installed components for all products UINT WINAPI MsiEnumComponentsA( DWORD iComponentIndex, // 0-based index into installed components LPSTR lpComponentBuf); // buffer of char count: 39 (size of string GUID) UINT WINAPI MsiEnumComponentsW( DWORD iComponentIndex, // 0-based index into installed components LPWSTR lpComponentBuf); // buffer of char count: 39 (size of string GUID) #ifdef UNICODE #define MsiEnumComponents MsiEnumComponentsW #else #define MsiEnumComponents MsiEnumComponentsA #endif // !UNICODE // Enumerate the client products for a component UINT WINAPI MsiEnumClientsA( LPCSTR szComponent, DWORD iProductIndex, // 0-based index into client products LPSTR lpProductBuf); // buffer of char count: 39 (size of string GUID) UINT WINAPI MsiEnumClientsW( LPCWSTR szComponent, DWORD iProductIndex, // 0-based index into client products LPWSTR lpProductBuf); // buffer of char count: 39 (size of string GUID) #ifdef UNICODE #define MsiEnumClients MsiEnumClientsW #else #define MsiEnumClients MsiEnumClientsA #endif // !UNICODE // Enumerate the qualifiers for an advertised component. UINT WINAPI MsiEnumComponentQualifiersA( LPCSTR szComponent, // generic component ID that is qualified DWORD iIndex, // 0-based index into qualifiers LPSTR lpQualifierBuf, // qualifier buffer DWORD *pcchQualifierBuf, // in/out qualifier buffer character count LPSTR lpDescriptionBuf, // description buffer DWORD *pcchDescriptionBuf); // in/out description buffer character count UINT WINAPI MsiEnumComponentQualifiersW( LPCWSTR szComponent, // generic component ID that is qualified DWORD iIndex, // 0-based index into qualifiers LPWSTR lpQualifierBuf, // qualifier buffer DWORD *pcchQualifierBuf, // in/out qualifier buffer character count LPWSTR lpDescriptionBuf, // description buffer DWORD *pcchDescriptionBuf); // in/out description buffer character count #ifdef UNICODE #define MsiEnumComponentQualifiers MsiEnumComponentQualifiersW #else #define MsiEnumComponentQualifiers MsiEnumComponentQualifiersA #endif // !UNICODE // -------------------------------------------------------------------------- // Functions to obtain product or package information. // -------------------------------------------------------------------------- // Open the installation for a product to obtain detailed information UINT WINAPI MsiOpenProductA( LPCSTR szProduct, // product code OR descriptor MSIHANDLE *hProduct); // returned product handle, must be closed UINT WINAPI MsiOpenProductW( LPCWSTR szProduct, // product code OR descriptor MSIHANDLE *hProduct); // returned product handle, must be closed #ifdef UNICODE #define MsiOpenProduct MsiOpenProductW #else #define MsiOpenProduct MsiOpenProductA #endif // !UNICODE // Open a product package in order to access product properties UINT WINAPI MsiOpenPackageA( LPCSTR szPackagePath, // location of package MSIHANDLE *hProduct); // returned product handle, must be closed UINT WINAPI MsiOpenPackageW( LPCWSTR szPackagePath, // location of package MSIHANDLE *hProduct); // returned product handle, must be closed #ifdef UNICODE #define MsiOpenPackage MsiOpenPackageW #else #define MsiOpenPackage MsiOpenPackageA #endif // !UNICODE // Provide the value for an installation property. UINT WINAPI MsiGetProductPropertyA( MSIHANDLE hProduct, // product handle obtained from MsiOpenProduct LPCSTR szProperty, // property name, case-sensitive LPSTR lpValueBuf, // returned value, NULL if not desired DWORD *pcchValueBuf); // in/out buffer character count UINT WINAPI MsiGetProductPropertyW( MSIHANDLE hProduct, // product handle obtained from MsiOpenProduct LPCWSTR szProperty, // property name, case-sensitive LPWSTR lpValueBuf, // returned value, NULL if not desired DWORD *pcchValueBuf); // in/out buffer character count #ifdef UNICODE #define MsiGetProductProperty MsiGetProductPropertyW #else #define MsiGetProductProperty MsiGetProductPropertyA #endif // !UNICODE // Determine whether a file is a package // Returns ERROR_SUCCESS if file is a package. UINT WINAPI MsiVerifyPackageA( LPCSTR szPackagePath); // location of package UINT WINAPI MsiVerifyPackageW( LPCWSTR szPackagePath); // location of package #ifdef UNICODE #define MsiVerifyPackage MsiVerifyPackageW #else #define MsiVerifyPackage MsiVerifyPackageA #endif // !UNICODE // Provide descriptive information for product feature: title and description. // Returns the install level for the feature, or -1 if feature is unknown. // 0 = feature is not available on this machine // 1 = highest priority, feature installed if parent is installed // >1 = decreasing priority, feature installation based on InstallLevel property UINT WINAPI MsiGetFeatureInfoA( MSIHANDLE hProduct, // product handle obtained from MsiOpenProduct LPCSTR szFeature, // feature name DWORD *lpAttributes, // attribute flags for the feature LPSTR lpTitleBuf, // returned localized name, NULL if not desired DWORD *pcchTitleBuf, // in/out buffer character count LPSTR lpHelpBuf, // returned description, NULL if not desired DWORD *pcchHelpBuf); // in/out buffer character count UINT WINAPI MsiGetFeatureInfoW( MSIHANDLE hProduct, // product handle obtained from MsiOpenProduct LPCWSTR szFeature, // feature name DWORD *lpAttributes, // attribute flags for the feature LPWSTR lpTitleBuf, // returned localized name, NULL if not desired DWORD *pcchTitleBuf, // in/out buffer character count LPWSTR lpHelpBuf, // returned description, NULL if not desired DWORD *pcchHelpBuf); // in/out buffer character count #ifdef UNICODE #define MsiGetFeatureInfo MsiGetFeatureInfoW #else #define MsiGetFeatureInfo MsiGetFeatureInfoA #endif // !UNICODE // -------------------------------------------------------------------------- // Functions to install missing components and files. These should be used // as a last resort. // -------------------------------------------------------------------------- // Install a component unexpectedly missing, provided only for error recovery // This would typically occur due to failue to establish feature availability // The product feature having the smallest incremental cost is installed UINT WINAPI MsiInstallMissingComponentA( LPCSTR szProduct, // product code LPCSTR szComponent, // component Id, string GUID INSTALLSTATE eInstallState); // local/source/default, absent invalid UINT WINAPI MsiInstallMissingComponentW( LPCWSTR szProduct, // product code LPCWSTR szComponent, // component Id, string GUID INSTALLSTATE eInstallState); // local/source/default, absent invalid #ifdef UNICODE #define MsiInstallMissingComponent MsiInstallMissingComponentW #else #define MsiInstallMissingComponent MsiInstallMissingComponentA #endif // !UNICODE // Install a file unexpectedly missing, provided only for error recovery // This would typically occur due to failue to establish feature availability // The missing component is determined from the product's File table, then // the product feature having the smallest incremental cost is installed UINT WINAPI MsiInstallMissingFileA( LPCSTR szProduct, // product code LPCSTR szFile); // file name, without path UINT WINAPI MsiInstallMissingFileW( LPCWSTR szProduct, // product code LPCWSTR szFile); // file name, without path #ifdef UNICODE #define MsiInstallMissingFile MsiInstallMissingFileW #else #define MsiInstallMissingFile MsiInstallMissingFileA #endif // !UNICODE #ifdef __cplusplus } #endif // -------------------------------------------------------------------------- // Error codes for installer access functions - until merged to winerr.h // -------------------------------------------------------------------------- #ifndef ERROR_INSTALL_FAILURE #define ERROR_INSTALL_USEREXIT 1602L // User cancel installation. #define ERROR_INSTALL_FAILURE 1603L // Fatal error during installation. #define ERROR_INSTALL_SUSPEND 1604L // Installation suspended, incomplete. #define ERROR_UNKNOWN_PRODUCT 1605L // Product code not registered. #define ERROR_UNKNOWN_FEATURE 1606L // Feature ID not registered. #define ERROR_UNKNOWN_COMPONENT 1607L // Component ID not registered. #define ERROR_UNKNOWN_PROPERTY 1608L // Unknown property. #define ERROR_INVALID_HANDLE_STATE 1609L // Handle is in an invalid state. #define ERROR_BAD_CONFIGURATION 1610L // Configuration data corrupt. #define ERROR_INDEX_ABSENT 1611L // Component qualifier not present. #define ERROR_INSTALL_SOURCE_ABSENT 1612L // Install source unavailable. #define ERROR_PRODUCT_UNINSTALLED 1614L // Product is uninstalled. #define ERROR_BAD_QUERY_SYNTAX 1615L // SQL query syntax invalid or unsupported. #define ERROR_INVALID_FIELD 1616L // Record field does not exist. #endif #ifndef ERROR_INSTALL_STARTING #define ERROR_INSTALL_STARTING 1600L // Preparing to install... #define ERROR_INSTALL_SERVICE_FAILURE 1601L // Failure accessing installation service. #define ERROR_INSTALL_PACKAGE_VERSION 1613L // Database version unsupported. #define ERROR_INVALID_COMMAND_LINE 1617L // Invalid command line argument. #define ERROR_INSTALL_ALREADY_RUNNING 1618L // An installation is in progress. #define ERROR_INSTALL_PACKAGE_OPEN_FAILED 1619L // Installation package could not be opened. #define ERROR_INSTALL_PACKAGE_INVALID 1620L // Installation package invalid. #define ERROR_INSTALL_UI_FAILURE 1621L // Could not initialize installer user interface. #define ERROR_INSTALL_LOG_FAILURE 1622L // Error opening installation log file. #define ERROR_INSTALL_LANGUAGE_UNSUPPORTED 1623L // Product language not supported by system. #define ERROR_INSTALL_TRANFORM_FAILURE 1624L // Error applying transform to install package. #define ERROR_INSTALL_PACKAGE_REJECTED 1625L // Install package signature not accepted. #define ERROR_FUNCTION_NOT_CALLED 1626L // Function could not be executed. #define ERROR_FUNCTION_FAILED 1627L // Function failed during execution. #define ERROR_INVALID_TABLE 1628L // Invalid or unknown table specified. #define ERROR_DATATYPE_MISMATCH 1629L // Data supplied is of wrong type. #define ERROR_UNSUPPORTED_TYPE 1630L // Data of this type is not supported. #define ERROR_CREATE_FAILED 1631L // Data of this type is not supported. #endif #ifndef ERROR_INSTALL_TEMP_UNWRITABLE #define ERROR_INSTALL_TEMP_UNWRITABLE 1632L // Temp folder is full or inaccessible #endif #endif // _MSI_H_