1. Уважаемые гости и пользователи форума.
    Администрация настоятельно рекомендует не регистрировать несколько аккаунтов для одного пользователя. При выявлении наличия мультиаккаунтов будут заблокированы все учетные записи данного пользователя.
    Аккаунты, зарегистрированные на временную почту будут также заблокированы.

FAQ FAQ по Inno Setup

Тема в разделе "Inno Setup", создана пользователем Shegorat, 16 июн 2011.

Метки:
  1. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    1.145
    Симпатии:
    733
    В: Как сделать анимированный баннер?
    О: Так (спасибо El Sanchez)
    Код (Inno):
    [Setup]
    AppName=test
    AppVerName=test
    DefaultDirName={tmp}
    Uninstallable=no
    CreateUninstallRegKey=no
    OutputDir=.

    [Languages]
    Name: ru; MessagesFile: compiler:Languages\russian.isl

    [Files]
    Source: "giphy.gif"; Flags: dontcopy solidbreak

    [Code]
    #define A = (Defined UNICODE) ? "W" : "A"
    const
      WS_CHILD = $40000000;
      WS_VISIBLE = $10000000;
      WS_DISABLED = $08000000;

    // ATL Functions
    function AtlAxWinInit: BOOL; external 'AtlAxWinInit@atl.dll stdcall';
    function AtlAxCreateControl(lpszName: string; hWnd: HWND; pStream, ppUnkContainer: Longint): HResult; external 'AtlAxCreateControl@atl.dll stdcall';

    // Window Functions
    function GetSysColor(nIndex: Integer): DWORD; external 'GetSysColor@user32.dll stdcall';
    function CreateWindowEx(dwExStyle: DWORD; lpClassName, lpWindowName: string; dwStyle: DWORD; x, y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU; hInstance, lpParam: Longint): HWND; external 'CreateWindowEx{#A}@user32.dll stdcall';
    function DestroyWindow(hWnd: HWND): BOOL; external 'DestroyWindow@user32.dll stdcall';

    var
      GIFWndHandle: HWND;

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    function ShowAnimatedGIF(AWndParent: HWND; ALeft, ATop, AWidth, AHeight: Integer; AUrl: string; AColor: TColor): HWND;
    (*
    Parameters:
      AWndParent...: A handle to the parent window
      ALeft........: The initial horizontal position of the window
      ATop.........: The initial vertical position of the window
      AWidth.......: The width of the window
      AHeight......: The height of the window
      AUrl.........: The URL or full path of the GIF file
      AColor.......: Color background
    Return value:
      A handle to ActiveX control host window
    *)

    var
      HTMLStr: string;
      ResultCode: HResult;
    begin
      if not AtlAxWinInit then Exit;
      Result := CreateWindowEx(0, 'AtlAxWin', '', WS_CHILD or WS_VISIBLE or WS_DISABLED, ALeft, ATop, AWidth, AHeight, AWndParent, 0, 0, 0);
      if Result = 0 then
        RaiseException(SysErrorMessage(DLLGetLastError));

      if AColor < 0 then
        AColor := GetSysColor(AColor and $0000FF);
      HTMLStr := Format('about:<html><body leftmargin="0" topmargin="0" scroll="no" bgcolor="#%.2x%.2x%.2x"><p align="center"><img src="%s" height="100%%"></img></p></body></html>', [AColor and $0000FF, AColor and $00FF00 shr 8, AColor and $FF0000 shr 16, AUrl]);

      ResultCode := AtlAxCreateControl(HTMLStr, Result, 0, 0);
      if ResultCode <> 0 then
        RaiseException(SysErrorMessage(ResultCode));
    end;

    ///////////////////////////
    procedure InitializeWizard;
    begin
      ExtractTemporaryFile('giphy.gif');
      GIFWndHandle := ShowAnimatedGIF(WizardForm.SelectDirPage.Handle,
        0, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + ScaleY(5), WizardForm.SelectDirPage.Width, WizardForm.DiskSpaceLabel.Top - WizardForm.DirEdit.Top - WizardForm.DirEdit.Height - ScaleY(5),
         ExpandConstant('{tmp}\giphy.gif'), WizardForm.SelectDirPage.Color);
    end;

    ////////////////////////////
    procedure DeinitializeSetup;
    begin
      if GIFWndHandle <> 0 then
        DestroyWindow(GIFWndHandle);
    end;
     
     
    YURSHAT, Хамик и Nemko нравится это.
  2. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    1.145
    Симпатии:
    733
    В: Как сделать HexToStr и StrToHex?
    О: Так
    Код (Inno):
    [Setup]
    AppName=test
    AppVerName=test
    DefaultDirName={tmp}
    Uninstallable=no
    CreateUninstallRegKey=no
    OutputDir=.

    [Languages]
    Name: ru; MessagesFile: compiler:Languages\russian.isl

    [Code]
    function HexToStr(str_hex: string): string;
    var
      i: Integer;
    begin
      Result:= '';
      StringChange(str_hex, ',', '');
      for i:= 1 to Length(str_hex) div 2 do
        Result:= Result +  Chr(StrToInt('$' + Copy(str_hex, (i-1)*2+1, 2)));
    end;

    function StrToHex(str: string): string;
    var
      i: Integer;
    begin
      Result:= '';
      for i:= 1 to Length(str) do
        Result:= Result +  Format('%.2x', [Ord(str[i]), Ord(str[i])]);
    end;

    procedure InitializeWizard;
    var
      S: string;
    begin
      S := HexToStr('6D6F757365');
      MsgBox(S, mbInformation, MB_OK);
      S := StrToHex('mouse');
      MsgBox(S, mbInformation, MB_OK);
    end;
     
     
    YURSHAT и Хамик нравится это.
  3. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    1.145
    Симпатии:
    733
    В: Как отрисовать миниатюру?
    О: Так
    Код (Inno):
    [Setup]
    AppName=MainForm
    AppVerName=MainForm 1.0
    DefaultDirName={pf}\MainForm
    // Нужно вырубить эту страницу т.к. там ставится фокус на кнопку Next
    DisableReadyPage=yes
    OutputDir=.

    [Code]
    function GetForegroundWindow: HWND; external 'GetForegroundWindow@user32.dll stdcall delayload';
    function SetForegroundWindow(hWnd: HWND): BOOL; external 'SetForegroundWindow@user32.dll stdcall delayload';

    procedure MShow(Sender: TObject);
    begin
      MainForm.Show;
    if GetForegroundWindow = WizardForm.Handle then
      SetForegroundWindow(MainForm.Handle);
    end;

    procedure DirOnClick(Sender: TObject);
    var
      UserSelectDir: String;
    begin
      UserSelectDir:= WizardForm.DirEdit.Text;
    if BrowseForFolder(SetupMessage(msgBrowseDialogLabel), UserSelectDir, True) then
      WizardForm.DirEdit.Text:= UserSelectDir;
    end;

    procedure InitializeWizard();
    var
      r: TRect;
    begin
    with MainForm do
    begin
      Width:= WizardForm.Width;
      Height:= WizardForm.Height;
      BorderIcons := WizardForm.BorderIcons;
      BorderStyle := WizardForm.BorderStyle;
      Position:= poDesktopCenter;
    with TBitmapImage.Create(MainForm) do
    begin
      Parent:= MainForm;
      Width:= MainForm.ClientWidth;
      Height:= MainForm.ClientHeight;
    with Bitmap do begin
      Width:= Width;
      Height:= Height;
      Canvas.Brush.Color:= clWindow;
      r.Left:=0;
      r.Top:=0;
      r.Right:=WizardfOrm.ClientWidth;
      r.Bottom:=WizardForm.ClientHeight;
      Canvas.FillRect(r);
    end;
    end;
    end;
      WizardForm.Left:= -10000;
      WizardForm.OnShow:= @MShow;
    //
      WizardForm.NextButton.Parent:= MainForm;
      WizardForm.BackButton.Parent:= MainForm;
      WizardForm.CancelButton.Parent:= MainForm;
      WizardForm.OuterNotebook.Parent:= MainForm;
      WizardForm.Bevel.Parent:= MainForm;
      WizardForm.DirBrowseButton.OnClick:= @DirOnClick;
    end;

    function GetSystemMenu(hWnd: HWND; bRevert: BOOL): LongWord; external 'GetSystemMenu@user32.dll stdcall';
    function EnableMenuItem(hMenu: THandle; uIDEnableItem: Longword; uEnable: Longword): Boolean; external 'EnableMenuItem@user32.dll stdcall';

    const
      MF_BYCOMMAND = 0;
      MF_ENABLED = 0;
      MF_GRAYED = 1;
      MF_DISABLED = 2;
      SC_CLOSE = 61536;

    procedure CurPageChanged(CurPageID: Integer);
    begin
    if CurPageID=wpSelectDir then
      WizardForm.NextButton.Caption:= SetupMessage(msgButtonInstall);
    if CurPageID=wpFinished then
      EnableMenuItem(GetSystemMenu(MainForm.Handle, false), SC_CLOSE, MF_DISABLED or MF_BYCOMMAND);
    end;
     
    p.s. 3-ий год скрипту, не знаю почему сюда не выложил еще, забыл наверное. :D
    http://krinkels.org/threads/wintb.1952/page-2#post-25893
     
    Последнее редактирование: 22 май 2018
    Winst@n, YURSHAT и Nemko нравится это.
  4. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    1.145
    Симпатии:
    733
    В: Как менять формат в Языковых параметрах для приложения на момент запуска?
    О: Пример с Dead Space 3
    Код (Inno):
    [Setup]
    AppName=Language
    AppVersion=1.0
    DefaultDirName=no
    CreateUninstallRegKey=no
    SetupIconFile=101.ico
    Uninstallable=no
    Compression=none
    OutputDir=.

    [Code]
    #include "Modules\ExecAndWait.iss"

    function ShowWindow(hWnd: Integer; uType: Integer): Integer; external 'ShowWindow@user32.dll stdcall';

    var
      lang, switch: string;
     
    function InitializeSetup(): Boolean;
    begin
      ShowWindow(Application.Handle, 0);
    if (FileExists(ExpandConstant('{src}\deadspace3_Game.exe')) and FileExists(ExpandConstant('{src}\GDFBinary_en_US.dll'))) or (FileExists(ExpandConstant('{src}\deadspace3_Game.exe')) and FileExists(ExpandConstant('{src}\GDFBinary_ru_RU.dll'))) then
    begin
      RegQueryStringValue(HKEY_CURRENT_USER, 'Control Panel\International', 'LocaleName', lang);
    if FileExists(ExpandConstant('{src}\GDFBinary_en_US.dll')) then
      switch:= 'en-US';
    if FileExists(ExpandConstant('{src}\GDFBinary_ru_RU.dll')) then
      switch:= 'ru-RU';
    if switch<>lang then
      RegWriteStringValue(HKEY_CURRENT_USER, 'Control Panel\International', 'LocaleName', switch);
    if ExtractFileName(ExpandConstant('{srcexe}'))<>'deadspace3_Game.exe' then
      ExecAndWait(ExpandConstant('{src}\deadspace3_Game.exe'), '', SW_SHOW, true, 0);
    if switch<>lang then
      RegWriteStringValue(HKEY_CURRENT_USER, 'Control Panel\International', 'LocaleName', lang);
    end else
      MsgBox('Error!', mbError, MB_OK);
      Result:= False;
    end;
     

    Вложения:

    Последнее редактирование: 30 июн 2018

Поделиться этой страницей