Dela via


Anropa databasfunktioner från program

Innan du anropar någon av följande Database Functions- från ett program, till exempel en anpassad åtgärd eller en automatiseringsprocess, måste installationsprogrammet först köra åtgärden CostInitialize, FileCost-åtgärdoch CostFinalize-åtgärd.

Följande är en lista över databasfunktioner som används i Windows Installer:

Innan du anropar MsiSetFeatureAttributes från ett program måste installationsprogrammet först köra åtgärden CostInitialize. Installationsprogrammet kör sedan åtgärden CostFinalize efter MsiSetFeatureAttributes.

I följande exempel visas i vilken ordning funktionsåtgärder måste anropas när du använder MsiGetTargetPath i ett program.

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