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:

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;  
}