如何将 DLL 中的表单嵌入到 Inno Setup 向导页面中?

2023-12-13

我在 Delphi DLL 中构建了一些 VCL 表单,这些表单在 Inno Setup 安装期间显示。然而,如果我可以将这些表单嵌入到 Inno Setup 向导中,那就会更加简洁。

我该怎么做呢?


对您来说最简单的方法是创建一个导出函数,它将执行库中的所有操作。此类功能所需的最低限度是应将表单嵌入其中的 Inno Setup 控件的句柄参数。对于嵌入,您需要了解的下一个必要事项是边界,但您可以通过库端的 Windows API 函数调用来获取边界。

下面是 Delphi 部分,显示了来自 DLL 项目的单元形式:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids;

type
  TEmbeddedForm = class(TForm)
    StringGrid1: TStringGrid;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  end;

procedure CreateEmbeddedForm(ParentWnd: HWND); stdcall;

implementation

{$R *.dfm}

{ TEmbeddedForm }

procedure TEmbeddedForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

{ CreateEmbeddedForm }

procedure CreateEmbeddedForm(ParentWnd: HWND); stdcall;
var
  R: TRect;
  Form: TEmbeddedForm;
begin
  Form := TEmbeddedForm.Create(nil);
  Form.ParentWindow := ParentWnd;
  Form.BorderStyle := bsNone;
  GetWindowRect(ParentWnd, R);
  Form.BoundsRect := R;
  Form.Show;
end;

exports
  CreateEmbeddedForm;

end.

这是 Inno 安装脚本:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program

[Files]
Source: "MyDLL.dll"; Flags: dontcopy

[Code]
procedure CreateEmbeddedForm(ParentWnd: HWND);
  external 'CreateEmbeddedForm@files:MyDLL.dll stdcall';

procedure InitializeWizard;
var
  CustomPage: TWizardPage;
begin
  CustomPage := CreateCustomPage(wpWelcome, 'Caption', 'Description');
  CreateEmbeddedForm(CustomPage.Surface.Handle);
end;

请注意,Inno Setup 还支持COM Automation,所以上述方式并不是将对象嵌入到向导表单中的唯一选择。然而,这是最简单的一种。

哦,还有一点,了解一下可能对您有好处。如果您需要从库中执行特定的 Inno Setup 脚本代码,您可以通过在 Inno Setup 端创建一个回调函数并在 DLL 端传递和执行它来实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 DLL 中的表单嵌入到 Inno Setup 向导页面中? 的相关文章

  • 无法使用 Indy 从 Gmail 获取电子邮件

    I use TIdPOP3很多 而且效果很好 除了 GMail 帐户 不知怎的 它永远不起作用 我尝试了不同的组合和端口 无论是否使用 SSL 它总是返回不同的错误 我最近的尝试是在 Gmail 上创建 应用程序特定 密码 并尝试使用此密码
  • 创建无边框表单而不丢失 Windows 命令

    我已将表单更改为无边框表单 我只是更改了BorderStyle财产给bsNone 但现在我的应用程序失去了 Windows 锚点和一些命令 例如 WIN 对齐表单客户端 WIN 最小化表格 WIN 表格右对齐 WIN 表格左对齐 我尝试过设
  • 当系统文件实际存在时找不到它

    系统找不到alg exe但它确实存在 c windows system32 alg exe 我最近从 Win 7 x86 迁移到 x64 当我使用 x86 时 我对此没有任何问题 尝试了 Delphi 7 和 XE2 我正在使用的代码 if
  • 安装软件包时出现无法加载软件包 %s 错误

    我正在 Delphi 2007 上进行测试 我的小组项目由 2 个包组成 包运行 bpl 它被标记为 仅运行时 并包含一个名为 uMyTestRun pas 的单元 其中定义了一个空的 TFrame 后代 unit uMyTestRun i
  • 整个 Inno Setup 安装程序的完整性检查

    我们使用 Inno Setup 作为安装程序 最近有用户在安装过程中报告如下错误 尝试复制文件时发生错误 源文件已损坏 这是由于安装文件确实已损坏 理想情况下 安装 EXE 会在初始化时执行某种检查 以查看整个 EXE 是否有效 但显然它只
  • 如何改变TDateTimePicker的颜色?

    如何更改 a 的颜色TDateTimePicker A 日期和时间选择器可以有一种颜色 通常这是通过设置来完成的Color procedure TForm1 FormCreate Sender TObject begin DateTimeP
  • 加载前检查 OSX 包的签名

    目标 加载已验证已签名 或针对任意算法进行验证 的 so bundle 我希望能够使用 OSX 的内置二进制签名工具或某些自定义算法来验证 so bundle 然后使用 dlopen 加载该 so bundle 问题在于似乎没有编程方式来检
  • 将 XSL 嵌入 XML 以在 Web 浏览器中显示:我做错了什么?

    所以我试图研究这个 但我几乎束手无策 我找到了一种将 XSL 嵌入 XML 的方法dpawson co uk http www dpawson co uk xsl sect2 onefile html 但我不知道我做错了什么 我在互联网上搜
  • 在这些情况下限制破折号的正则表达式模式

    Scenario 我正在使用第三方文件重命名软件 该软件是用 Delphi 编写的 并且具有 pascal 脚本支持 该应用程序允许使用正则表达式来重命名文件 这意味着 如果我需要对文件名执行的操作不能仅使用一个正则表达式来完成 那么我可以
  • 控制台应用程序比 GUI 应用程序运行得更快吗? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我对编程世界比较陌生 我有几个性能问
  • Delphi - 引用在运行时创建的组件

    我正在使用 Delphi 5 并且在运行时创建许多面板 然后在面板上创建按钮 显然也是在运行时创建 我需要这样做 因为将来我可能需要动态创建更多面板 按钮组合 我可以完成所有这些 但我不知道如何引用我创建的面板 因为我找不到访问面板组件名称
  • 从 C# 调用 C++ DLL

    我想使用 C 中的 C DLL C DLL 是win32 控制台应用程序 我已成功调用它 并希望在 C 中处理来自 C 的数据 然而 C 应用程序在执行 DLL 后退出 即这一行 GetArrayFromDLL 我是 C 和 Visual
  • 应用程序需要很长时间才能同步线程(或根本不同步)

    我在 Delphi XE5 iOS 和 Android 中使用 REST 组件 我目前正在通过 iOS 模拟器进行测试 我的应用程序often挂在我的代码中的以下行 R Request Execute 经过一些调试后 我发现它特别挂在 RE
  • 良好的 Delphi Prism 在线资源

    在 Google 上搜索 delphi prism delphi prism 资源 或 delphi prism 代码片段 几乎找不到好的网站 是否有任何好的编程网站提供大量有关 Delphi Prism 的代码片段和教程 提前致谢 oma
  • 如何使用 LiveBindings 在 TStringGrid 中显示超过 200 行?

    我有一个TDataSource这是由一个支持TClientDataset绑定到一个TStringGrid 我通过右键单击网格并选择 Link to DB Datasource 然后选择数据源 这为我设置了 LiveBindings 当我运行
  • 如何将 C 静态库公开到 .Net?

    将 C 函数公开给 C 和 Net 有哪些步骤 我想在 C C 和 Net 中为 32 位和 64 位构建使用相同的函数名称 我发布这个问题和答案是因为我没有在任何地方找到这些技术的记录 步骤是 将 C 函数公开为 C 静态库 lib Us
  • Delphi应用程序中子菜单位置错误

    我的应用程序是用delphi 编写的 由于某种原因 主菜单的行为不再像昨天那样 我可能在不知情的情况下触及了某些属性 现在 当我单击带有子项的菜单项时 尽管箭头位于右侧 但子菜单始终向左打开 是什么原因以及如何恢复 正如问题评论中所揭示的那
  • 获取当前时间毫秒

    如何获取当前时间 以毫秒为单位 我知道使用Now 但我需要以毫秒为单位的时间 var today TDateTime begin today Now DateUtils MilliSecondsBetween Now 0
  • 德尔福 LZMA

    我在 7 zip 网站上找到了一个 LZMA 库 但是没有用 我不使用文件 只使用流 出于某些原因 7 zip 站点上的库只将标头写入流而不压缩流 有人遇到了一些问题吗 有例子吗 知道 Delphi 的其他 LZMA 库吗 Tks 我自己没
  • 为什么 PC 之间的控件缩放比例不同?

    我尝试通过隐藏一些元素为用户提供 干净简单 的界面 只有一个小箭头表示他可以展开主菜单栏的某些部分 当全部关闭时 它看起来像这样 当你全部打开时 它看起来像这样 每个箭头都是位于面板左侧的速度按钮 通过单击该按钮 宽度可以在 速度 按钮 关

随机推荐