Appel de fonctions de base de données à partir de programmes
Avant d’appeler l’une des fonctions de base de données suivantes à partir d’un programme, comme une action personnalisée ou un processus d’automatisation, le programme d’installation doit d’abord exécuter l’action CostInitialize, l’action FileCost et l’action CostFinalize.
Voici la liste des fonctions de base de données utilisées dans Windows Installer :
- MsiGetComponentState
- MsiGetFeatureCost
- MsiGetFeatureState
- MsiGetFeatureValidStates
- MsiGetSourcePath
- MsiGetTargetPath
- MsiSetComponentState
- MsiSetFeatureState
- MsiSetInstallLevel
- MsiSetTargetPath
- MsiVerifyDiskSpace
Avant d’appeler MsiSetFeatureAttributes à partir d’un programme, le programme d’installation doit d’abord exécuter l’action CostInitialize. Le programme d’installation exécute ensuite l’action CostFinalize après MsiSetFeatureAttributes.
L’exemple suivant illustre l’ordre dans lequel les actions de fonction doivent être appelées lors de l’utilisation de MsiGetTargetPath dans un programme.
#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;
}