我想從基本的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)
歡迎任何幫助或建議!
對不起,10年前我會一直這麼做,但是現在我沒有看到將這些努力投入InstallScript的意義。我要麼做一個C++自定義操作或C#自定義操作。如果您正在嘗試做我認爲您正在嘗試做的事(以登錄服務的形式進行登錄),那麼在WiX創作的合併模塊中執行此操作的方法遠遠更簡單,然後由InstallShield使用。 –
使用C++的自定義操作聽起來像一個有趣的命題。我不熟悉WiX。 – user2097370
爲了完成循環,我把所有東西放在一個C++ DLL中(帶有靜態鏈接 - 當我遇到運行時不匹配,但這是另一個故事)。我將DLL作爲二進制數據隱藏在二進制表中。 – user2097370