Chiamata di funzioni di database da programmi

Prima di chiamare una delle funzioni di database seguenti da un programma, ad esempio un'azione personalizzata o un processo di automazione, il programma di installazione deve prima eseguire l'azione CostInitialize, l'azione FileCost e CostFinalize.

Di seguito è riportato un elenco di funzioni di database usate in Windows Installer:

Prima di chiamare MsiSetFeatureAttributes da un programma, il programma di installazione deve prima eseguire l'azione CostInitialize. Il programma di installazione esegue quindi l'azione CostFinalize dopo MsiSetFeatureAttributes.

Nell'esempio seguente viene illustrato l'ordine in cui è necessario chiamare le azioni della funzione quando si usa MsiGetTargetPath in un programma.

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