Aufrufen von Datenbankfunktionen aus Programmen
Vor dem Aufrufen einer der folgenden Datenbankfunktionen aus einem Programm, z. B. einer benutzerdefinierten Aktion oder einem Automatisierungsprozess, muss das Installationsprogramm zuerst die Aktion CostInitialize,die FileCost-Aktionund die CostFinalize-Aktion ausführen.
Im Folgenden finden Sie eine Liste der Datenbankfunktionen, die im Windows verwendet werden:
- MsiGetComponentState
- MsiGetFeatureCost
- MsiGetFeatureState
- MsiGetFeatureValidStates
- MsiGetSourcePath
- MsiGetTargetPath
- MsiSetComponentState
- MsiSetFeatureState
- MsiSetInstallLevel
- MsiSetTargetPath
- MsiVerifyDiskSpace
Vor dem Aufrufen von MsiSetFeatureAttributes über ein Programm muss das Installationsprogramm zuerst die Aktion CostInitialize ausführen. Das Installationsprogramm führt dann die Aktion CostFinalize nach MsiSetFeatureAttributes aus.
Das folgende Beispiel veranschaulicht die Reihenfolge, in der Funktionsaktionen aufgerufen werden müssen, wenn MsiGetTargetPath in einem Programm verwendet wird.
#include <windows.h>
#include <Msiquery.h>
#include <tchar.h>
#pragma comment(lib, "msi.lib")
int main()
{
MSIHANDLE hInstall;
TCHAR *szBuf;
DWORD cch = 0 ;
if(MsiOpenPackage(_T("PathToPackage...."), &hInstall) == ERROR_SUCCESS)
{
if(MsiDoAction(hInstall, _T("CostInitialize"))==ERROR_SUCCESS
&& MsiDoAction(hInstall, _T("FileCost"))==ERROR_SUCCESS
&& MsiDoAction(hInstall, _T("CostFinalize"))==ERROR_SUCCESS)
{
if(MsiGetTargetPath(hInstall, _T("FolderName"), _T(""),&cch)==ERROR_MORE_DATA)
{
cch++; // add 1 to include null terminator since MsiGetTargetPath does not include it on return
szBuf = (TCHAR *) malloc(cch*sizeof(TCHAR));
if(szBuf)
{
if(MsiGetTargetPath(hInstall, _T("FolderName"), szBuf,&cch)==ERROR_SUCCESS)
{
// Add code to use szBuf here
}
free(szBuf);
}
}
}
MsiCloseHandle(hInstall);
}
return 0;
}