我正在尝试从基本的 MSI InstallShield 代码调用 Advapi32.LsaOpenPolicy()。我已经成功调用了其他 avdapi32.dll 方法;但是 LsaOPenPolicy 抛出了不匹配的类型错误。
我的原型是:
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
);
我在 C++ 示例中注意到 ObjectAttriibute 结构被清零。所以我在 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 和 microsoft 论坛上发布了这个——但我在那里没有得到任何关注。(后代参考:flexera-link,microsoft-link)
欢迎任何帮助或建议!