Partilhar via


Chamando funções de banco de dados de programas

Antes de chamar qualquer um dos seguintes Funções de Banco de Dados de um programa, como uma ação personalizada ou um processo de automação, o instalador deve primeiro executar a ação CostInitialize, ação FileCoste ação CostFinalize.

A seguir está uma lista de funções de banco de dados usadas no Windows Installer:

  • MsiGetComponentState
  • MsiGetFeatureCost
  • MsiGetFeatureState
  • MsiGetFeatureValidStates
  • MsiGetSourcePath
  • MsiGetTargetPath
  • MsiSetComponentState
  • MsiSetFeatureState
  • MsiSetInstallLevel
  • MsiSetTargetPath
  • MsiVerifyDiskSpace

Antes de chamar MsiSetFeatureAttributes de um programa, o instalador deve primeiro executar a ação CostInitialize. Em seguida, o instalador executa a ação CostFinalize após MsiSetFeatureAttributes.

O exemplo a seguir ilustra a ordem na qual as ações de função devem ser chamadas ao usar MsiGetTargetPath em um 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;  
}