void MsiGetPropertyByOpenPackage()
{
MSIHANDLE msiHandle = NULL;
UINT uiOpenState;
TCHAR* szMsiFileName= _T("C:\\Program Files (x86)\\远为软件\\virnos client\\SWar.msi");
uiOpenState = MsiOpenPackage(szMsiFileName, &msiHandle);
if (ERROR_SUCCESS != uiOpenState)
{
// error
return;
}
TCHAR* szValueBuf = NULL;
DWORD cchValueBuf = 0;
UINT uiState =MsiGetProperty(msiHandle, TEXT("ProductName"), TEXT(""), &cchValueBuf);
if (ERROR_MORE_DATA == uiState)
{
++cchValueBuf;
szValueBuf = new TCHAR(cchValueBuf);
if (szValueBuf)
{
uiState = MsiGetProperty(msiHandle, TEXT("ProductName"), szValueBuf, &cchValueBuf);
}
}
MsiCloseHandle(msiHandle);
}
调用MsiOpenPackage函数来获取MSIHANDLE值,然后就可以获取属性值,MsiOpenPackage使用的时候会打开msi文件,会看到程序运行时的界面,再调用MsiCloseHandle(hInstall)函数就关闭msi文件,也会看到msi程序运行界面消失。
用该方法的时候就会看到有msi瞬间闪现安装界面,体验感觉不好
因此使用MsiOpenDatabase打开msi文件,然后再获取,后面相继使用MsiDatabaseOpenView,MsiViewExecute,MsiViewFetch,MsiRecordGetString等方法,
使用MsiCloseHandle关闭打开的msi句柄。
BOOL GetMsiPropertyProductVersion(CString strMsiName, CString &strVer )
{
USES_CONVERSION;
MSIHANDLE hMsiHandle = NULL;
UINT uiStatus = MsiOpenDatabase(strMsiName, MSIDBOPEN_READONLY, &hMsiHandle);
if (ERROR_SUCCESS != uiStatus)
{
return FALSE;
}
MSIHANDLE hView = NULL;
MsiDatabaseOpenView(hMsiHandle, _T("SELECT * FROM Property WHERE Property = 'ProductVersion'"), &hView);
MSIHANDLE hRecord = NULL;
MsiViewExecute(hView, hRecord);
if (MsiViewFetch(hView, &hRecord) == ERROR_SUCCESS)
{
TCHAR szName[MAX_PATH]={0};
TCHAR szValue[MAX_PATH]={0};
DWORD dwStringLen = MAX_PATH;
MsiRecordGetString(hRecord, 1, szName, &dwStringLen);
dwStringLen = MAX_PATH;
MsiRecordGetString(hRecord, 2, szValue, &dwStringLen );
printf("%s\t:%s\r\n", T2A(szName), T2A(szValue));
strVer = szValue;
MsiCloseHandle(hView);
MsiCloseHandle(hMsiHandle);
return TRUE;
}
MsiCloseHandle(hView);
MsiCloseHandle(hMsiHandle);
return FALSE;
}
UINT GetMsiAllProperty(CString strMsiName )
{
USES_CONVERSION;
MSIHANDLE hMsiHandle = NULL;
UINT uiStatus = MsiOpenDatabase(strMsiName, MSIDBOPEN_READONLY, &hMsiHandle);
if (ERROR_SUCCESS != uiStatus)
{
return uiStatus;
}
MSIHANDLE hView = NULL;
MsiDatabaseOpenView(hMsiHandle, _T("SELECT * FROM Property"), &hView);
MSIHANDLE hRecord = NULL;
MsiViewExecute(hView, hRecord);
while(MsiViewFetch(hView, &hRecord) == ERROR_SUCCESS)
{
TCHAR szValueBuf[MAX_PATH]={0};
TCHAR Source[MAX_PATH]={0};
DWORD dwStringLen = MAX_PATH;
MsiRecordGetString(hRecord, 1, szValueBuf, &dwStringLen);
dwStringLen = MAX_PATH;
MsiRecordGetString(hRecord, 2, Source, &dwStringLen );
printf("%s\t:%s\r\n", T2A(szValueBuf), T2A(Source));
}
MsiCloseHandle(hView);
MsiCloseHandle(hMsiHandle);
return 1;
}