Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1264
Благодарности: 1024

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: 7z 7-zip32.7z
(288.4 Kb, 13 просмотров)

Цитата niki12899@vk:
Если вкратце, то меня интересует просто, как сделать бинарник большого размера (что я уже узнал, путём изменения расширения rar на bin) и как его подключить к своему установщику. »
niki12899@vk, архив(ы) вы сами делаете, берёте папки и файлы установленной игры и пакуете их с помощью 7-zip, в один или несколько архивов это решаете вы. Вот вам шаблон, где идет распаковка архива dummy.bin, находящегося рядом с установщиком, в папку установки:
Скрытый текст

Код: Выделить весь код
[Setup]
AppName=test
AppVerName=test
DefaultDirName={pf}\test

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

[CustomMessages]
ru.SevenZipStatusExtractFiles=Распаковка файлов из %1:
ru.SevenZipProgressCaptions=Прогресс:%nСкорость:%nПрошло:%nОсталось:
ru.SevenZipProgressInfo=%1%% (%2 из %3)%n%4%n%5%n%6
ru.SevenZipExtractFailed=При распаковке архива %1 произошла ошибка. Код ошибки: %2

[Files]
Source: 7-zip32.dll; Flags: dontcopy
#ifndef IS_ENHANCED
  #if VER < 0x06000000
; https://web.archive.org/web/20150510131335if_/http://restools.hanzify.org/inno/callbackctrl/InnoCallbackCtrl_V1.1.zip
Source: CallbackCtrl.dll; Flags: dontcopy
  #endif
#endif

[Code]
const
  WM_GETFONT = $0031;
  WM_SETTEXT = $000C;
  WM_USER    = $0400;

  PBM_SETPOS     = WM_USER + 2;
  PBM_SETRANGE32 = WM_USER + 6;

  GWL_STYLE = -16;

  WS_CLIPSIBLINGS = $04000000;
  WS_VISIBLE      = $10000000;
  WS_CHILDWINDOW  = $40000000;
  SS_RIGHT = $2;

  CP_ACP  = 0;
  CP_UTF8 = 65001;

  FNAME_MAX32 = 512;
  MAX_PATH = 260;

  ARCEXTRACT_BEGIN     = 0;
  ARCEXTRACT_INPROCESS = 1;

type
  { 7-zip.dll. }
  TExtractingInfo = record
    szSourceFileName: PAnsiChar;
    szDestFileName: PAnsiChar;
    dwFileSize: DWORD;
    szFileSize: PAnsiChar;
    dwWriteSize: DWORD;
    szWriteSize: PAnsiChar;
    dwProgress: DWORD;
    szSpeed: PAnsiChar;
    szElapsed: PAnsiChar;
    szRemain: PAnsiChar;
  end;

  { User-defined data passed to callback. }
  TArcParam = record
    FilenameLabelHWND: HWND;
    ProgressGaugeHWND: HWND;
    ProgressInfoHWND: HWND;
  end;

#ifndef IS_ENHANCED
  #if VER < 0x06000000
  TExtractCallbackProc = function (nState: UINT; var ExtInfo: TExtractingInfo; var ArcParam: TArcParam): BOOL;
  #endif
#endif

// Unicode and Character Set Functions
function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: string;
  cchWideChar: Integer; lpMultiByteStr: AnsiString; cbMultiByte, lpDefaultChar: Integer;
  lpUsedDefaultChar: Longint): Integer; external 'WideCharToMultiByte@kernel32.dll stdcall';
function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: AnsiString;
  cbMultiByte: Integer; lpWideCharStr: string; cchWideChar: Integer): Integer; external 'MultiByteToWideChar@kernel32.dll stdcall';
// Shell Lightweight Utility Functions
function PathCompactPath(hDC: THandle; lpszPath: string; dx: UINT): BOOL; external 'PathCompactPathW@shlwapi.dll stdcall';
// Painting and Drawing Functions
function GetDC(hWnd: HWND): THandle; external 'GetDC@user32.dll stdcall';
// Device Context Functions/
function SaveDC(hdc: THandle): Integer; external 'SaveDC@gdi32.dll stdcall';
function RestoreDC(hdc: THandle; nSavedDC: Integer): BOOL; external 'RestoreDC@gdi32.dll stdcall';
function ReleaseDC(hWnd: HWND; hDC: THandle): Integer; external 'ReleaseDC@user32.dll stdcall';
function SelectObject(hdc, hgdiobj: THandle): THandle; external 'SelectObject@gdi32.dll stdcall';
// Window Functions
function GetClientRect(hWnd: HWND; var lpRect: TRect): BOOL; external 'GetClientRect@user32.dll stdcall';
// Message Functions
function SendMessageString(hWnd: HWND; Msg: UINT; wParam: Longint; lParam: string): Longint; external 'SendMessageW@user32.dll stdcall';
// Window Class Functions
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLongW@user32.dll stdcall';
// 7-zip.dll Functions
function SevenZip(const CmdLine: AnsiString; ArcProc: Longint; var LParam: TArcParam): Integer; external 'SevenZip@files:7-zip32.dll stdcall';
#ifndef IS_ENHANCED
  #if VER < 0x06000000
// CallbackCtrl.dll Functions
function WrapExtractProc(Callback: TExtractCallbackProc; ParamCount: Integer): LongWord; external 'wrapcallbackaddr@files:callbackctrl.dll stdcall';
  #endif
#endif

var
  ProgressInfoContainer, ProgressInfo: TNewStaticText;
  ArcProc: LongWord;

function UTF8Encode(const Value: string): AnsiString;
var
  Len: Integer;
begin
  if Value = '' then Exit;
  Len := WideCharToMultiByte(CP_UTF8, 0, Value, -1, '', 0, 0, 0);
  if Len = 0 then Exit;
  Result := StringOfChar(#0, Len - 1);
  if WideCharToMultiByte(CP_UTF8, 0, Value, -1, Result, Len, 0, 0) = 0 then Exit;
end;

function UTF8Decode(const Value: AnsiString): string;
var
  Len: Integer;
begin
  if Value = '' then Exit;
  Len := MultiByteToWideChar(CP_UTF8, 0, Value, -1, '', 0);
  if Len = 0 then Exit;
  Result := StringOfChar(#0, Len - 1);
  if MultiByteToWideChar(CP_UTF8, 0, Value, -1, Result, Len) = 0 then Exit;
end;

function ExtractCallbackProc(nState: UINT; var ExtInfo: TExtractingInfo; var ArcParam: TArcParam): BOOL;
var
  LText: string;
  DC, SaveIndex: THandle;
  LRect: TRect;
begin
  { Avoid call VCL methods or get/set properties. }
  Result := True;
  case nState of
    ARCEXTRACT_BEGIN:
      begin
        DC := GetDC(ArcParam.FilenameLabelHWND);
        SaveIndex := SaveDC(DC);
        try
          SelectObject(DC, SendMessage(ArcParam.FilenameLabelHWND, WM_GETFONT, 0, 0));
          GetClientRect(ArcParam.FilenameLabelHWND, LRect);
          LText := UTF8Decode(ExtInfo.szDestFileName);
          PathCompactPath(DC, LText, LRect.Right - LRect.Left);
          SendMessageString(ArcParam.FilenameLabelHWND, WM_SETTEXT, 0, LText);
        finally
          if SaveIndex <> 0 then
            RestoreDC(DC, SaveIndex);
          ReleaseDC(ArcParam.FilenameLabelHWND, DC);
        end;
      end;
    ARCEXTRACT_INPROCESS:
      begin
        PostMessage(ArcParam.ProgressGaugeHWND, PBM_SETRANGE32, 0, 100);
        PostMessage(ArcParam.ProgressGaugeHWND, PBM_SETPOS, ExtInfo.dwProgress, 0);
        LText := FmtMessage(CustomMessage('SevenZipProgressInfo'), [IntToStr(ExtInfo.dwProgress),
          ExtInfo.szWriteSize, ExtInfo.szFileSize, ExtInfo.szSpeed, ExtInfo.szElapsed, ExtInfo.szRemain]);
        SendMessageString(ArcParam.ProgressInfoHWND, WM_SETTEXT, 0, LText);
      end;
  end;
end;

procedure ExtractPackage(const AFileName, ADestPath: string);
var
  CmdLine: AnsiString;
  ArcParam: TArcParam;
  ResultCode: Integer;
begin
  if FileExists(AFileName) then
  try
    WizardForm.StatusLabel.Caption := FmtMessage(CustomMessage('SevenZipStatusExtractFiles'), [ExtractFileName(AFileName)]);
    ProgressInfoContainer.Show;
    CmdLine := UTF8Encode(ExpandConstant(Format('x -y "%s" -o"%s\"', [AFileName, ADestPath])));
    ArcParam.FilenameLabelHWND := WizardForm.FilenameLabel.Handle;
    ArcParam.ProgressGaugeHWND := WizardForm.ProgressGauge.Handle;
    ArcParam.ProgressInfoHWND := ProgressInfo.Handle;
    ResultCode := SevenZip(CmdLine, ArcProc, ArcParam);
    if ResultCode <> 0 then
      RaiseException(FmtMessage(CustomMessage('SevenZipExtractFailed'), [ExtractFileName(AFileName), Format('0x%.8x', [ResultCode])]));
  except
    ShowExceptionMessage;
  finally
    ProgressInfoContainer.Hide;
    WizardForm.StatusLabel.Caption := SetupMessage(msgStatusExtractFiles);
    WizardForm.FilenameLabel.Caption := '';
  end;
end;

procedure CreateInstallingPage;
begin
  { ProgressInfoContainer. }
  ProgressInfoContainer := TNewStaticText.Create(WizardForm);
  with ProgressInfoContainer do
  begin
    Parent := WizardForm.InstallingPage;
    Align := alBottom;
    AutoSize := False;
    Caption := CustomMessage('SevenZipProgressCaptions');
    Height := Parent.ClientHeight - WizardForm.ProgressGauge.Top - WizardForm.ProgressGauge.Height - ScaleY(5);
  end;

  { ProgressInfo. }
  ProgressInfo := TNewStaticText.Create(WizardForm);
  with ProgressInfo do
  begin
    Parent := ProgressInfoContainer;
    Align := alRight;
    AutoSize := False;
    Width := Parent.ClientWidth div 2;
    SetWindowLong(Handle, GWL_STYLE, WS_CHILDWINDOW or WS_VISIBLE or WS_CLIPSIBLINGS or SS_RIGHT);
  end;
#ifdef IS_ENHANCED
  ArcProc := CallbackAddr('ExtractCallbackProc');
#elif VER >= 0x06000000
  ArcProc := CreateCallback(@ExtractCallbackProc);
#else
  ArcProc := WrapExtractProc(@ExtractCallbackProc, 3);
#endif
end;

procedure InitializeWizard;
begin
  CreateInstallingPage;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  case CurStep of
    ssPostInstall:
      begin
        ExtractPackage(ExpandConstant('{src}\dummy.bin'), ExpandConstant('{app}'));
      end;
  end;
end;

В шаблоне нет секции UninstallDelete, т.к. я не знаю структуры ваших файлов и папок. Деинсталлятор ничего не знает про извлекаемые из архива файлы, поэтому в ней описываете корневые файлы и папки из архивов.

Последний раз редактировалось El Sanchez, 15-12-2020 в 19:25.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:44, 15-12-2020 | #713