Aufrufen von Datenbankfunktionen aus Programmen
Bevor Sie eine der folgenden Datenbank funktionen aus einem Programm aufrufen, z. B. eine benutzerdefinierte Aktion oder einen Automatisierungsprozess, muss das Installationsprogramm zuerst die CostInitialize-Aktion, FileCost-Aktionund CostFinalize-Aktionausführen.
Es folgt eine Liste der Datenbankfunktionen, die in Windows Installer verwendet werden:
- MsiGetComponentState-
- MsiGetFeatureCost-
- MsiGetFeatureState-
- MsiGetFeatureValidStates
- MsiGetSourcePath-
- MsiGetTargetPath-
- MsiSetComponentState-
- MsiSetFeatureState-
- MsiSetInstallLevel-
- MsiSetTargetPath-
- MsiVerifyDiskSpace-
Vor dem Aufrufen MsiSetFeatureAttributes aus einem Programm muss das Installationsprogramm zuerst die CostInitialize-Aktion ausführen. Anschließend führt das Installationsprogramm die CostFinalize-Aktion nach MsiSetFeatureAttributesaus.
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;
}