Search code examples
inno-setuppascalscript

Inno Setup - How to edit the "About Setup" dialog text box


I need to edit or replace the text in the About Setup dialog box text of Inno Setup.

Here is a picture:

enter image description here

Looking in the internet i got this code:

[Files]
Source: CallbackCtrl.dll; Flags: dontcopy

[Code]
type
  TWFProc = function(h:hWnd;Msg,wParam,lParam:Longint):Longint;

function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam: Longint; lParam: Longint): Longint; external '[email protected] stdcall';
function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external '[email protected] stdcall';
function WrapWFProc(Callback: TWFProc; ParamCount: Integer): Longword; external 'wrapcallbackaddr@files:CallbackCtrl.dll stdcall';

var
  OldProc:Longint;

procedure AboutSetupClick;
begin
  //Edit your text here
  MsgBox('CUSTOM TEXT HERE', mbInformation, MB_OK);
end;

function WFWndProc(h:HWND;Msg,wParam,lParam:Longint):Longint;
begin
  if (Msg=$112) and (wParam=9999) then begin
    Result:=0;
    AboutSetupClick;
  end else begin
    if Msg=$2 then SetWindowLong(WizardForm.Handle,-4,OldProc);
    Result:=CallWindowProc(OldProc,h,Msg,wParam,lParam);
  end;
end;

procedure InitializeWizard;
begin
  OldProc:=SetWindowLong(WizardForm.Handle,-4,WrapWFProc(@WFWndProc,4));
end;

Seems to work fine..

enter image description here

But if i close the installer, i get crash message.

enter image description here

Please i need help to fix this code or give a better example to change the text in the About Setup dialog text box.

The DLL i used. HERE


Solution

  • You need to give the saved original windows procedure back to the wizard form before you exit the setup application. To do so, use something like this:

    const
      GWL_WNDPROC = -4;
    
    procedure DeinitializeSetup;
    begin
      SetWindowLong(WizardForm.Handle, GWL_WNDPROC, OldProc);
    end;
    

    Anyway, you can use more trustful library for wrapping callbacks, the InnoCallback library. I've made a review of the code you used and added support for Unicode InnoSetup versions, expecting the use of the InnoCallback library:

    [Files]
    Source: "InnoCallback.dll"; DestDir: "{tmp}"; Flags: dontcopy
    
    [Code]
    #ifdef UNICODE
      #define AW "W"
    #else
      #define AW "A"
    #endif
    const
      GWL_WNDPROC = -4;
      SC_ABOUTBOX = 9999;
      WM_SYSCOMMAND = $0112;
    
    type
      WPARAM = UINT_PTR;
      LPARAM = LongInt;
      LRESULT = LongInt;
      TWindowProc = function(hwnd: HWND; uMsg: UINT; wParam: WPARAM; 
        lParam: LPARAM): LRESULT;
    
    function CallWindowProc(lpPrevWndFunc: LongInt; hWnd: HWND; Msg: UINT; 
      wParam: WPARAM; lParam: LPARAM): LRESULT;
      external 'CallWindowProc{#AW}@user32.dll stdcall';  
    function SetWindowLong(hWnd: HWND; nIndex: Integer; 
      dwNewLong: LongInt): LongInt;
      external 'SetWindowLong{#AW}@user32.dll stdcall';    
    function WrapWindowProc(Callback: TWindowProc; ParamCount: Integer): LongWord;
      external 'wrapcallback@files:InnoCallback.dll stdcall'; 
    
    var
      OldWndProc: LongInt;
    
    procedure ShowAboutBox;
    begin
      MsgBox('Hello, I''m your about box!', mbInformation, MB_OK);
    end;
    
    function WndProc(hwnd: HWND; uMsg: UINT; wParam: WPARAM; 
      lParam: LPARAM): LRESULT;
    begin
      if (uMsg = WM_SYSCOMMAND) and (wParam = SC_ABOUTBOX) then
      begin
        Result := 0;
        ShowAboutBox;
      end
      else
        Result := CallWindowProc(OldWndProc, hwnd, uMsg, wParam, lParam);
    end;
    
    procedure InitializeWizard;
    begin
      OldWndProc := SetWindowLong(WizardForm.Handle, GWL_WNDPROC, 
        WrapWindowProc(@WndProc, 4));
    end;
    
    procedure DeinitializeSetup;
    begin
      SetWindowLong(WizardForm.Handle, GWL_WNDPROC, OldWndProc);
    end;