2013-10-22 105 views
0


我在我的MSI安裝程序中有屬性MYPATH,我正在向此路徑安裝一些組件。現在我想要獲取安裝組件的路徑。我使用下面的代碼:MSI獲取安裝屬性值C++

INSTALLUILEVEL pervousUILevel = MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 
MSIHANDLE handle = NULL; 
MsiOpenProduct(productCode,&handle); 
wchar_t myPath[2048]; 
DWORD dwBuffer = 2048; 
MsiGetProductProperty(handle, L"MYPATH", myPath, &dwBuffer); 
MsiCloseHandle(handle); 
MsiSetInternalUI(pervousUILevel, NULL); 

但我仍然得到默認值爲「C:\ MyDefaultPath」,而不是「C:\的路徑我指定在安裝過程中」。我究竟做錯了什麼?
感謝

編輯:
我發現代碼:

wchar_t myPath[4096]; 
DWORD isBuffer = 4096; 
MsiGetComponentPath(productCode, L"{component-guid}", myPath, &isBuffer); 

也返回的默認路徑。

回答

1

發生這種情況是因爲您直接從MSI軟件包讀取值。您需要在安裝過程中獲取屬性值,使用MsiGetProperty API methodm with a custom action.鏈接的示例適用於進行序列驗證的自定義操作,您從那裏獲得的興趣僅在於您定義自定義操作的方式以及如何獲取值,其餘的代碼你不需要

+0

你好波格丹,謝謝你的回覆!安裝過程完成後,有沒有辦法獲得這個屬性值,即在獨立的C++控制檯應用程序中?另一個想法讓我困惑的是,當我爲安裝到INSTALLDIR的組件獲取MsiGetComponentPath時,該函數爲我提供了安裝時選擇的INSTALLDIR。 – Marek

+1

MsiGetProperty僅在安裝過程中起作用。要在安裝完成後獲取該值,您需要先將其保存在註冊表中,然後從中讀取。這就是爲什麼MsiGetComponentPath似乎是你所需要的。成本計算操作(CostInitialize - > CostFinalize)完成後,您可能會設置MYPATH的值,但我不能肯定地說,因爲我沒有使用太多的MsiGetComponentPath,所以我主要編寫在安裝過程中要執行的自定義操作處理。 –

+0

我在執行MSI時直接發送MYPATH。感謝您澄清,這是不好的方式,我會從註冊表或一些配置文件讀取屬性。 – Marek