获取Msi文件的属性内容

来源:互联网 发布:淘宝店组织架构 编辑:程序博客网 时间:2024/06/13 05:36

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){// errorreturn;}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;}


原创粉丝点击