InnoSetup:是否可以打开我的自定义Delphi表单(来自DLL)而不是标准设置向导

时间:2011-12-21 07:32:38

标签: forms delphi dll inno-setup wizard

我需要使用自己的组件(有点OneClick安装程序)创建一个复杂的表单,并将其用作标准InnoSetup向导的替代品。有可能吗?

我的表单被放入DLL中,此DLL将可用于InnoSetup进程。

这就是我尝试这样做的方式:

Delphi DLL代码

library OneClickWizard;

uses
  SysUtils,
  Classes,
  Wizard in 'Wizard.pas' {FormWizard};

{$R *.res}

exports
  CreateWizardForm,
  DestroyWizardForm;

begin
end.

德尔福表格

unit Wizard;

interface

type
  TFormWizard = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormWizard: TFormWizard;

procedure CreateWizardForm(AppHandle: THandle); stdcall;
procedure DestroyWizardForm; stdcall;

implementation

{$R *.dfm}

procedure CreateWizardForm(AppHandle: THandle);
begin
  Application.Handle := AppHandle;
  FormWizard := TFormWizard.Create(Application);
  FormWizard.Show;
  FormWizard.Refresh;
end;

procedure DestroyWizardForm;
begin
  FormWizard.Free;
end;

InnoSetup脚本(iss)

[Setup]
;Disable all of the default wizard pages
DisableDirPage=yes
DisableProgramGroupPage=yes
DisableReadyMemo=true
DisableReadyPage=true
DisableStartupPrompt=true
DisableWelcomePage=true
DisableFinishedPage=true

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

[Code]
procedure CreateWizardForm(AppHandle: Cardinal); 
  external 'CreateWizardForm@files:OneClickWizard.dll stdcall';
procedure DestroyWizardForm;
  external 'DestroyWizardForm@files:OneClickWizard.dll stdcall';


procedure InitializeWizard();
begin
  CreateWizardForm(MainForm.Handle);
end;

屏幕上出现的表单,但它对我的输入没有反应。似乎它超出了主要的消息周期。如何正确地做到这一点?

3 个答案:

答案 0 :(得分:6)

在我的设置中,我做了类似的事情。 InnoSetup代码我将句柄作为StrToInt(ExpandConstant('{wizardhwnd}'))传递(我猜是MainForm.Handle为零)

DLL中的

OldAppHandle := Application.Handle;
try
  Application.Handle := hAppHandle; // hAppHandle the handle from InnoSetup
  F := TfmZForm.Create(Application);
  try
    F.Caption := lpTitle;
    F.ShowModal;
    Result := F.ErrorCode;
  finally
    F.Free;
  end;
finally
  Application.Handle := OldAppHandle;
end;

答案 1 :(得分:5)

我对InnoSetup一无所知,但你肯定需要使用ShowModal而不是Show here。安装UI总是模态的,你想要的是等到用户在返回Inno之前完成对表单的迭代。否则,Inno将如何知道何时继续? ShowModal运行一个消息循环来为表单提供服务,这样就不会有接收输入的问题。

您还可以更改DLL以删除DestroyWizardForm,因为调用ShowModal的函数可以创建和销毁表单。

答案 2 :(得分:1)

如果要完全替换UI,可能更容易创建呈现表单的存根应用程序,然后以静默方式运行正常设置,传递各种命令行参数。

使用Inno的原生表单和向导页面函数/逻辑,或者至少使用它。