鑑於MSI產品代碼,我想從已安裝的產品中獲取升級代碼(以及其他屬性)。我試圖通過調用MsiOpenProduct方法,然後MsiGetProductProperty()。安(略)的例子看起來是這樣的:MsiOpenProduct是從已安裝產品中讀取屬性的正確方法嗎?
MSIHANDLE handle = NULL;
MsiOpenProduct(strProductCode,&handle);
CString strUpgradeCode;
MsiGetProductProperty(handle,_T("UpgradeCode"), strUpgradeCode.GetBuffer(GUID_LENGTH), &dwSize);
strUpgradeCode.ReleaseBuffer();
MsiCloseHandle(handle);
這讓我的期望值,並從MSDN文檔來看,這似乎是做到這一點的一種有效方式:
的MsiOpenProduct功能打開 產品用於訪問產品數據庫的功能 。當處理不再需要 時,必須使用句柄將 MsiCloseHandle函數調用爲 。
但是,調用MsiOpenProduct()會彈出「Windows安裝程序準備安裝...」對話框。對MsiCloseHandle()的調用使它再次消失。
這讓我疑惑:
- 什麼調用MsiOpenProduct()引擎蓋下呢?我不想觸發任何操作,我只想讀取屬性。
- 我不介意彈出對話框,因爲這只是單元測試代碼,只要這沒有副作用。由於有許多單元測試可以做到這一點,所以它在連續快速打開和關閉手柄時仍然可以正常工作。
- 儘管我偶然發現了MsiGetProductInfo方法,但似乎無法獲取升級代碼。我對嗎?
- MsiOpenProduct是否正確讀取升級代碼等屬性?
我得出了同樣的結論 - 我使用VBScript中的OpenProduct來獲取UpgradeCode(COM調用,與C++調用不同)。我通過設置頂級安裝程序對象的UILevel屬性來抑制您所說的GUI。我發現獲得升級代碼的唯一方式是通過WMI:'從Win32_Property選擇*屬性='UpgradeCode'。對於特定的產品代碼: 'SELECT * FROM Win32_Property WHERE Property ='UpgradeCode'AND ProductCode ='{B862B671-59FD-7457-AFA0-C738FB7ABD60}''。也許我應該在下面添加一個答案,儘管它是VBScript。 – 2018-02-05 02:18:27