And*_*rew 5 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.
Run Code Online (Sandbox Code Playgroud)
德尔福形式
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;
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
表单出现在屏幕上,但它对我的输入没有反应.似乎它超出了主要的消息周期.怎么做到这一点?
在我的设置中,我做了类似的事情.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;
Run Code Online (Sandbox Code Playgroud)
我对InnoSetup一无所知,但你肯定需要使用ShowModal而不是Show here.安装UI总是模态的,你想要的是等到用户在返回Inno之前完成对表单的迭代.否则,Inno将如何知道何时继续?ShowModal运行一个消息循环来为表单提供服务,这样接收输入就没有问题了.
您还将更改您的DLL以删除DestroyWizardForm,因为调用ShowModal的函数可以创建和销毁表单.