如何从 MSI 自定义操作调用的 InstallScript 调用 DLL 函数

How to call DLL functions from InstallScript called by MSI custom action

我有一个名为 FSSetup.dll 的 DLL,我想从 InstallScript 代码调用它。我想从 MSI 自定义操作调用 InstallScript 代码。但似乎有一个问题,我不知道在哪里可以找到 FSSetup.dll。 InstallScript 函数正在启动,当它到达调用 DLL 函数的那一行时,整个安装中止。 MSI 日志报告:

MSI (c) (1C:3C) [09:39:52:261]: Invoking remote custom action. DLL: C:\Users\bmarty\AppData\Local\Temp\MSIBEAE.tmp, Entrypoint: f1
Action ended 9:39:55: BrowseFSKeyFile. Return value 3.
Info 2896. Executing action BrowseFSKeyFile failed.
Action ended 9:39:55: InstallWelcome. Return value 3.

InstallScript 代码如下所示:

export prototype BrowseFSKeyFile(HWND);
prototype FSSetup.FSBrowseFile( BYVAL STRING, BYVAL STRING, BYVAL STRING, BYREF STRING );   

function BrowseFSKeyFile(hMSI)
NUMBER  nKeyFile;
STRING  svKeyFile, szKPath, szKFile, szTemp, szTemp1;
begin
    MessageBox("Hi", INFORMATION);
    svKeyFile = "";
    FSBrowseFile( "*.key", "key", "Please select a KEY File...", svKeyFile );
    MessageBox("Bye", INFORMATION);
    ...
end;

我看到 "Hi" 消息,但安装在 "Bye" 之前中止。我怀疑这是因为 FSSetup.dll 在我的 MSIBEAE.tmp 所在的 %temp% 目录中不存在,这大概代表了由 InstallScript 编译生成的 ISSetup.dll 的提取名称。

编辑: MSI 调试器显示的 SUPPORDIR 值与 InstallScript 看到的值不同。 FSSetup.dll 存在于 MSI 提供的 SUPPORTDIR 中,但不存在于 InstallScript 中。

大约 9 年前,当 InstallShield 12.0 中修复了 InstallScript 的基本设计缺陷时,SUPPORTDIR 行为发生了变化。参见:

InstallShield 12 Beta2

InstallScript, meet CustomActionData

Upgrading Projects to InstallShield 12(搜索 SUPPORTDIR)

基本上您需要调用 MsiGetProperty() 来获取 SUPPORTDIR。您还需要将其作为 CustomActionData 传递给您的延迟自定义操作。

您缺少对 UseDll(和 UnUseDll)的调用。为了调用 UseDll,您需要知道相关 DLL 的位置。如果您已将它添加到 MSI 项目的支持文件中,您将需要检索 Windows 安装程序 属性 SUPPORTDIR 以找到此位置 - 这就是 Christopher Painter 的答案发挥作用的地方 -然后打电话给例如UseDll(szSupportDir ^ "FSSetup.dll") 在调用 FSBrowseFile.

之前