2011-12-21 3 views
5

내 구성 요소 (다소 OneClick 설치 프로그램)로 복잡한 양식을 만들어야합니다. 표준 InnoSetup 마법사. 가능한가?InnoSetup : 표준 설정 마법사 대신 DLL에서 내 사용자 정의 델파이 폼을 열 수 있습니까?

내 양식이 DLL에 저장되며이 DLL은 InnoSetup 프로세스에서 사용할 수 있습니다.

내가 그렇게하려고 노력하는 방법입니다

델파이 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 '[email protected]:OneClickWizard.dll stdcall'; 
procedure DestroyWizardForm; 
    external '[email protected]:OneClickWizard.dll stdcall'; 


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

양식이 화면에 나타나지만 내 입력에 반응하지 않습니다. 그것은 주요 메시지주기를 벗어난 것 같습니다. 이 작업을 올바르게 수행하는 방법은 무엇입니까?

답변

5

나는 InnoSetup에 관해서는 정확히 알지 못하지만, 분명히 여기서 Show가 아닌 ​​ShowModal을 사용해야 할 것입니다. 설치 UI는 항상 모달이며 원하는 것은 사용자가 Inno로 돌아 오기 전에 양식을 사용하여 iteracting을 마칠 때까지 기다리는 것입니다. 그렇지 않으면, Inno는 언제 진행해야하는지 어떻게 알 수 있습니까? ShowModal은 입력을받는 데 문제가 없도록 양식을 처리하는 메시지 루프를 실행합니다.

또한 ShowModal을 호출하는 함수가 양식을 작성하고 소멸시킬 수 있으므로 DestroyWizardForm을 제거하도록 DLL을 변경해야합니다.

+0

수치! ShowModal을 사용해야합니다 – Andrew

1

UI를 완전히 바꾸려면 양식을 제공하는 스텁 응용 프로그램을 만든 다음 다양한 명령 줄 매개 변수를 전달하는 자동 설치 모드에서 일반 설치를 실행하는 것이 더 쉽습니다.

Inno의 네이티브 양식 및 마법사 페이지 기능/논리를 사용하거나 최소한 사용하십시오.

6

제 설정에서 나는 비슷한 것을합니다. 내가 StrToInt(ExpandConstant('{wizardhwnd}'))으로 핸들을 전달 InnoSetup 코드는 DLL에

(내 생각 엔 MainForm.Handle이 제로라는 것이다) : 날

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; 
+0

큰 차이점은 ShowModal입니다. –

+0

표준 InnoSetup 마법사를 숨기려고하기 때문에 솔루션을 조금 수정했습니다. InitializeWizard() 프로 시저에서 WizardForm.BorderStyle을 추가했습니다. = bsNone; WizardForm.Width : = 0; WizardForm.Height : = 0; CreateWizardForm (WizardForm.Handle); – Andrew

+0

@kobik, 죄송 합니다만, David의 답변이 올바른지 확인해야합니다. 그는 ShowModal() – Andrew