如何从 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 行为发生了变化。参见:
和
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
.
之前
我有一个名为 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 行为发生了变化。参见:
和
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
.