Поделиться через


Вызов функций базы данных из программ

Перед вызовом любой из следующих функций базы данных из программы, например пользовательского действия или процесса автоматизации, установщик должен сначала запустить действие CostInitialize, FileCost и CostFinalize.

Ниже приведен список функций базы данных, используемых в установщике Windows.

Перед вызовом MsiSetFeatureAttributes из программы установщик должен сначала запустить действие CostInitialize. Затем установщик запускает действие CostFinalize после MsiSetFeatureAttributes.

В следующем примере показан порядок вызова действий функции при использовании MsiGetTargetPath в программе.

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