0

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

欢迎任何帮助或建议!

4

1 回答 1

0

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

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

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

于 2013-09-18T19:55:58.740 回答