2013-03-29 67 views
0

我想從基本的MSI InstallShield代碼調用Advapi32.LsaOpenPolicy()。我已經成功調用其他avdapi32.dll方法;但是LsaOPenPolicy拋出了一個不匹配的類型錯誤。InstallShield調用advapi32.dll方法類型不匹配錯誤

我的原型是:

prototype INT Advapi32.LsaOpenPolicy(POINTER, POINTER, INT, POINTER); 

窗戶的定義是:

NTSTATUS LsaOpenPolicy(
    _In_  PLSA_UNICODE_STRING SystemName, 
    _In_  PLSA_OBJECT_ATTRIBUTES ObjectAttributes, 
    _In_  ACCESS_MASK DesiredAccess, 
    _Inout_ PLSA_HANDLE PolicyHandle 
); 

我的ObjectAttriibute結構歸零C++樣品中指出。所以我在InstallShield代碼中做類似的事情 - pArray指向數組內容。

for i = 0 to 11 
     array(i) = 0; 
    endfor; 
    array(0) = 24; 

    // current error is 80020005 type mismatch. 
    try 
     i = POLICY_CREATE_ACCOUNT | POLICY_LOOKUP_NAMES; 
     pArray = array; 
     pPolicy = NULL; 
     nvOSResult = LsaOpenPolicy(NULL, pArray, i, pPolicy); 
    catch 
     Sprintf(errString, "0x%08x", Err.Number); 
     _Logger(hMSI, methodName, "LsaOpenPolicy Exception "+errString, INFORMATION, FALSE); 
     nvOSResult = Err.Number; 
    endcatch; 

沒有太多的其他信息,我可以找到比80020005錯誤拋出;我試過了一些不同的參數構造,但我無法克服這個問題。

我已經在flexera和微軟論壇發佈了這個 - 但我沒有得到什麼牽引力。 (後人參考:flexera-link,microsoft-link

歡迎任何幫助或建議!

+0

對不起,10年前我會一直這麼做,但是現在我沒有看到將這些努力投入InstallScript的意義。我要麼做一個C++自定義操作或C#自定義操作。如果您正在嘗試做我認爲您正在嘗試做的事(以登錄服務的形式進行登錄),那麼在WiX創作的合併模塊中執行此操作的方法遠遠更簡單,然後由InstallShield使用。 –

+0

使用C++的自定義操作聽起來像一個有趣的命題。我不熟悉WiX。 – user2097370

+0

爲了完成循環,我把所有東西放在一個C++ DLL中(帶有靜態鏈接 - 當我遇到運行時不匹配,但這是另一個故事)。我將DLL作爲二進制數據隱藏在二進制表中。 – user2097370

回答

0

此問題的答案是通過將所有工作移動到C++ DLL中,實際解決installshield和系統DLL之間的接口問題。由於安裝變得更加複雜,我最終得到了兩個獨立的DLL函數,一個在對話框(非管理)模式下執行,另一個在延遲執行(admin)模式下執行。

爲了傳遞信息我使用MsiGetProperty()API使用MSI屬性輸入和輸出變量。請注意,對於延遲執行,我需要在installshield端將數據編組到自定義操作數據位置,並在DLL端提取數據,再次通過使用MsiGetProperty(),但獲取「CustomActionData」屬性,然後解析包含編組數據的結果字符串。