InstallShield调用advapi32.dll方法类型不匹配错误

时间:2013-03-29 17:44:57

标签: installshield lsa

我试图从基本的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-linkmicrosoft-link

欢迎任何帮助或建议!

1 个答案:

答案 0 :(得分:0)

这个问题的答案是通过将所有工作转移到C ++ DLL中来实际解决installshield和系统DLL之间的接口问题。随着安装变得越来越复杂,我最终得到了两个独立的DLL函数,一个在对话(非管理)模式下执行,另一个在延迟执行(admin)模式下执行。

为了传递信息,我使用MsiGetProperty()API,使用MSI属性作为输入和输出变量。

请注意,对于延迟执行,我需要在installshield端将CAD函数封送到自定义操作数据位置,并在DLL端提取数据,再次使用MsiGetProperty()但获取“CustomActionData”属性然后解析包含封送数据的结果字符串。