我试图从基本的MSI InstallShield代码调用Advapi32.LsaOpenPolicy()。我已成功调用其他avdapi32.dll方法;但LsaOPenPolicy引发了不匹配的类型错误。
我的原型是:
prototype INT Advapi32.LsaOpenPolicy(POINTER, POINTER, INT, POINTER);
Windows定义是:
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)
欢迎任何帮助或建议!
答案 0 :(得分:0)
这个问题的答案是通过将所有工作转移到C ++ DLL中来实际解决installshield和系统DLL之间的接口问题。随着安装变得越来越复杂,我最终得到了两个独立的DLL函数,一个在对话(非管理)模式下执行,另一个在延迟执行(admin)模式下执行。
为了传递信息,我使用MsiGetProperty()API,使用MSI属性作为输入和输出变量。
请注意,对于延迟执行,我需要在installshield端将CAD函数封送到自定义操作数据位置,并在DLL端提取数据,再次使用MsiGetProperty()但获取“CustomActionData”属性然后解析包含封送数据的结果字符串。