Llamada a funciones de base de datos desde programas

Antes de llamar a cualquiera de las siguientes funciones de base de datos desde un programa, como una acción personalizada o un proceso de automatización, el instalador debe ejecutar primero las acciones CostInitialize, FileCost y CostFinalize.

Ahora se muestra una lista de funciones de base de datos que se usan en Windows Installer:

Antes de llamar a MsiSetFeatureAttributes desde un programa, el instalador debe ejecutar primero la acción CostInitialize. Luego, el instalador ejecuta la acción CostFinalize después de MsiSetFeatureAttributes.

En el ejemplo siguiente se muestra el orden en el que se deben llamar las acciones de función al usar MsiGetTargetPath en un programa.

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