Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 9]
Как присвоить команду к каждому компоненту (для нормальной установки и распаковки портативной версии), чтобы можно было использовать тихую установку.
Пример (https://www.upload.ee/files/12411285/Example.rar.html)
habib2302
20-10-2020, 12:13
ZVSRus, Пробовал этот метод, но не работает. Может вы поможете соединить мой скрипт с вашим примером
Пробовал этот метод, но не работает.
Что конкретно не работает. Пример что привел выше, или что. В примере есть скомпилированный Setup.exe и два батника, запустите и проверьте.
habib2302
20-10-2020, 12:51
В примере есть скомпилированный Setup.exe »
При чем тут пример. Вы склейте два скрипта
При чем тут пример. Вы склейте два скрипта
Вам что нужно то, примеры, подсказки, или что-бы кто то за вас сделал?
habib2302
25-10-2020, 10:28
ZVSRus, Посмотрите, правильно ли сделал?
#define AppName "Axialis IconWorkshop"
#define AppVersion "6.9.1"
#include "include\botva2.iss"
[Setup]
AppName={#AppName}
AppVerName={#AppName} {#AppVersion}
AppId={#AppName}
AppVersion={#AppVersion}
AppCopyright=Xabib © 2020
AppPublisher=Axialis Software
AllowNoIcons=yes
DefaultDirName={code:GetDefaultDirName}\{#AppName}
DefaultGroupName={#AppName}
DisableWelcomePage=yes
DisableReadyPage=yes
DisableFinishedPage=yes
DirExistsWarning=no
PrivilegesRequiredOverridesAllowed=dialog
SetupIconFile=Install.ico
UninstallDisplayIcon={app}\IconWorkshop.exe
UninstallDisplayName={#AppName} {#AppVersion}
OutputBaseFilename={#AppName} {#AppVersion} RePack (& Portable) by Xabib
VersionInfoDescription={#AppName} RePack by Xabib
VersionInfoVersion={#AppVersion}
Compression=lzma2/ultra64
SolidCompression=true
InternalCompressLevel=ultra64
LZMADictionarySize=65536
LZMAMatchFinder=BT
LZMANumFastBytes=273
Uninstallable=not IsInPortableMode
UsePreviousAppDir=no
CreateUninstallRegKey=not IsInPortableMode
RawDataResource=Botva>botva2.dll,WMSI>WMSI.png
[Languages]
Name: enu; MessagesFile: compiler:default.isl
Name: rus; MessagesFile: compiler:Languages\russian.isl
[Messages]
BeveledLabel=RePack by Xabib
SelectLanguageTitle={#AppName}
[CustomMessages]
enu.CreateConfigShowOptions=Show options window (when finishing install)
enu.CreateDefaultConfig=Create default configuration
enu.ForbiddenDirMessage=In portable mode, %1 should not be installed in "Program Files" or similar system directories.
enu.InstallModePageCaption=Pick Installation Mode
enu.InstallModePageDescription=Do you prefer integration into Windows or a portable installation?
enu.InstallModePageNormalOption=Normal - Integrates into Windows
enu.InstallModePagePortableOption=Portable - Supports removeable drives (e.g., USB pen drives)
enu.InstallModePageSubCaption=Choose a normal installation that integrates into Windows (e.g., Startmenu, optional Explorer context menu), or a portable installation that can run on any compatible Windows machine.
enu.LanguageFilesComponent=Languages
enu.OpenInstallFolderAfterInstall=Open installation target folder
enu.ProgramFilesComponent=Program Files
enu.StatusRunHxDToCreateConfigFile=Create configuration file...
enu.TaskConfigurationFile=Configuration file:
enu.WriteProtectConfig=Make readonly
enu.PortableButtonInstall=&Unpack
rus.CreateConfigShowOptions=Показать окно параметров (после завершения установки)
rus.CreateDefaultConfig=Создать конфигурацию по умолчанию
rus.ForbiddenDirMessage=В портативном режиме %1 не следует устанавливать в «Program Files» или аналогичных системных каталогах.
rus.InstallModePageCaption=Выберите тип установки
rus.InstallModePageDescription=Предпочитаете интеграцию в Windows или портативную версию?
rus.InstallModePageNormalOption=Нормальная - интеграция в Windows
rus.InstallModePagePortableOption=Портативная - поддерживает переносимые устройства (USB/HDD)
rus.InstallModePageSubCaption=Выберите нормальный тип для установки программы в Windows (добавление в меню Пуск, опционально в контекстное меню) или портативную для работы программы на любом ПК, совместимым с Windows
rus.LanguageFilesComponent=Языки
rus.OpenInstallFolderAfterInstall=Открыть папку установки
rus.ProgramFilesComponent=Program Files
rus.StatusRunHxDToCreateConfigFile=Создать файл конфигурации...
rus.TaskConfigurationFile=Файл конфигурации:
rus.WriteProtectConfig=Сделать доступным только для чтения
rus.PortableButtonInstall=&Распаковать
[Files]
Source: "{app}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: not IsInPortableMode;
Source: "{userdocs}\*"; DestDir: "{userdocs}"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: not IsInPortableMode;
Source: "{userappdata}\*"; DestDir: "{userappdata}"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: not IsInPortableMode;
Source: "{app}\*"; DestDir: "{app}\App\IconWorkshop"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: IsInPortableMode;
Source: "{userdocs}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: IsInPortableMode;
Source: "{userappdata}\*"; DestDir: "{app}\App\DefaultData"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: IsInPortableMode;
Source: "IconWorkshopPortable.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: IsInPortableMode;
Source: "IconWorkshop_RUS.reg"; DestDir: "{app}\Data"; DestName: "IconWorkshop.reg"; Flags: ignoreversion; Languages: rus; Check: IsInPortableMode;
Source: "IconWorkshop_ENG.reg"; DestDir: "{app}\Data"; DestName: "IconWorkshop.reg"; Flags: ignoreversion; Languages: enu; Check: IsInPortableMode;
#include "include\Registry.iss"
[Run]
Filename: netsh.exe; Parameters: "advfirewall firewall add rule name=""{#AppName}"" dir=in action=block program=""{app}\IconWorkshop.exe"" enable=yes"; Check: not IsInPortableMode; Flags: runhidden;
Filename: netsh.exe; Parameters: "advfirewall firewall add rule name=""{#AppName}"" dir=out action=block program=""{app}\IconWorkshop.exe"" enable=yes"; Check: not IsInPortableMode; Flags: runhidden;
[Icons]
Name: {group}\{#AppName}; Filename: {app}\IconWorkshop.exe; Check: not IsInPortableMode;
Name: {group}\{cm:UninstallProgram,{#AppName}}; Filename: {uninstallexe}; Check: not IsInPortableMode;
Name: {autodesktop}\{#AppName}; Filename: {app}\IconWorkshop.exe; Tasks: desktopicon; Check: not IsInPortableMode;
[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Check: not IsInPortableMode;
[UninstallRun]
Filename: taskkill; Parameters: "/f /im IconWorkshop.exe"; Flags: RunHidden;
Filename: netsh.exe; Parameters: "advfirewall firewall delete rule name=""{#AppName}"""; Check: not IsInPortableMode; Flags: runhidden;
#include "include\UninstallDelete.iss"
[INI]
; Imported INI File: "C:\Users\Admin\Documents\Axialis Librarian\desktop.ini"
Filename: "{userdocs}\Axialis Librarian\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconFile"; String: "{app}\axlibico.dll"; Check: not IsInPortableMode;
Filename: "{userdocs}\Axialis Librarian\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconIndex"; String: "0"; Check: not IsInPortableMode;
; Imported INI File: "C:\Users\Admin\Documents\Axialis Librarian\Deleted Items\desktop.ini"
Filename: "{userdocs}\Axialis Librarian\Deleted Items\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconFile"; String: "{app}\axlibico.dll"; Check: not IsInPortableMode;
Filename: "{userdocs}\Axialis Librarian\Deleted Items\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconIndex"; String: "1"; Check: not IsInPortableMode;
; Imported INI File: "C:\Users\Admin\Documents\Axialis Librarian\Icons\desktop.ini"
Filename: "{userdocs}\Axialis Librarian\Icons\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconFile"; String: "{app}\axlibico.dll"; Check: not IsInPortableMode;
Filename: "{userdocs}\Axialis Librarian\Icons\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconIndex"; String: "6"; Check: not IsInPortableMode;
; Imported INI File: "C:\Users\Admin\Documents\Axialis Librarian\Media Files\desktop.ini"
Filename: "{userdocs}\Axialis Librarian\Media Files\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconFile"; String: "{app}\axlibico.dll"; Check: not IsInPortableMode;
Filename: "{userdocs}\Axialis Librarian\Media Files\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconIndex"; String: "12"; Check: not IsInPortableMode;
; Imported INI File: "C:\Users\Admin\Documents\Axialis Librarian\Media Files\Images\desktop.ini"
Filename: "{userdocs}\Axialis Librarian\Media Files\Images\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconFile"; String: "{app}\axlibico.dll"; Check: not IsInPortableMode;
Filename: "{userdocs}\Axialis Librarian\Media Files\Images\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconIndex"; String: "8"; Check: not IsInPortableMode;
; Imported INI File: "C:\Users\Admin\Documents\Axialis Librarian\Objects\desktop.ini"
Filename: "{userdocs}\Axialis Librarian\Objects\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconFile"; String: "{app}\axlibico.dll"; Check: not IsInPortableMode;
Filename: "{userdocs}\Axialis Librarian\Objects\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconIndex"; String: "14"; Check: not IsInPortableMode;
[Code]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
const
RT_RCDATA = 10;
var
InputOptionPage: TInputOptionWizardPage;
lResStream: TResourceStream;
lPicHandle: THandle;
i: integer;
Install: TNewRadioButton;
Portable: TNewRadioButton;
PortablePanel: TPanel;
InstallerPanel: TPanel;
function CheckParam(s: string): boolean;
begin
for i := 0 to ParamCount do
begin
Result := ParamStr(i) = s;
if Result then Break;
end;
end;
function GetInstallDir(S: String): String;
begin
if CheckParam('/P') then
Result:= ExpandConstant('{userdesktop}\{#AppName}')
else
Result:= ExpandConstant(S);
end;
function InstallCheck: Boolean;
begin
Result := Install.Checked or CheckParam('/I');
end;
function IsInPortableMode: Boolean;
begin
Result := InputOptionPage.Values[1] and CheckParam('/P');
end;
function GetDefaultDirName(const AParam: string): string;
begin
if ExpandConstant('{param:portable|0}') = '1' then
Result := ExpandConstant('{userdesktop}') else
Result := ExpandConstant('{autopf}');
end;
//Запрет распаковки в системные папки-----Start-----
function IsForbiddenDir(const ADir: string): Boolean;
begin
Result := IsAdminInstallMode and
((not IsWin64 and (Pos(ExpandConstant('{win}'), ADir) = 1)) or
(not IsWin64 and (Pos(ExpandConstant('{commonpf32}'), ADir) = 1)) or
(IsWin64 and (Pos(ExpandConstant('{commonpf64}'), ADir) = 1)));
end;
//Запрет распаковки в системные папки-----Finish-----
//Замена пути распаковки в зависимости от типа-----Start-----
procedure InstallModeListBoxClick(Sender: TObject);
begin
if IsInPortableMode and (CompareText(WizardDirValue, ExpandConstant('{autopf}\{#AppName}')) = 0) then
WizardForm.DirEdit.Text := ExpandConstant('{userdesktop}\{#AppName}')
else if not IsInPortableMode and (CompareText(WizardDirValue, ExpandConstant('{userdesktop}\{#AppName}')) = 0) then
WizardForm.DirEdit.Text := ExpandConstant('{autopf}\{#AppName}');
end;
//Замена пути распаковки в зависимости от типа-----Finish-----
//Создание новой страницы-----Start-----
procedure CreateInstallModePage;
begin
InputOptionPage := CreateInputOptionPage(wpWelcome, ExpandConstant('{cm:InstallModePageCaption}'),
ExpandConstant('{cm:InstallModePageDescription}'), ExpandConstant('{cm:InstallModePageSubCaption}'), True, False);
InputOptionPage.Add(ExpandConstant('{cm:InstallModePageNormalOption}'));
InputOptionPage.Add(ExpandConstant('{cm:InstallModePagePortableOption}'));;
InputOptionPage.Values[1] := ExpandConstant('{param:portable|0}') = '1';
InputOptionPage.Values[0] := not InputOptionPage.Values[1];
InputOptionPage.CheckListBox.OnClickCheck := @InstallModeListBoxClick;
end;
//Создание новой страницы-----Finish-----
//Замена текста в кнопке "Далее" в зависимости от типа-----Start-----
procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
wpSelectTasks:
begin
if not IsInPortableMode then
WizardForm.NextButton.Caption := SetupMessage(msgButtonInstall) else
WizardForm.NextButton.Caption := ExpandConstant('{cm:PortableButtonInstall}');
end;
end;
end;
//Замена текста в кнопке "Далее" в зависимости от типа-----Finish-----
//Уведомление о запрете распаковки в системные папки-----Start-----
function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := True;
case CurPageId of
wpSelectDir:
if IsInPortableMode then
begin
Result := not IsForbiddenDir(WizardDirValue);
if not Result then
MsgBox(ExpandConstant('{cm:ForbiddenDirMessage,{#AppName}}'), mbError, MB_OK);
end;
end;
end;
//Уведомление о запрете распаковки в системные папки-----Finish-----
//Отключение страници создания папку в Пуске при выборе типа Портативная-----Start-----
function ShouldSkipPage(PageID: Integer): Boolean;
begin
Result := False;
case PageID of
wpSelectProgramGroup:
Result := IsInPortableMode;
end;
end;
//Отключение страници создания папку в Пуске при выборе типа Портативная-----Finish-----
function GetFromRes(const ResName, SaveFileName: String): Boolean;
begin
lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
try
lResStream.SaveToFile(ExpandConstant('{tmp}\') + SaveFileName);
finally
lResStream.Free;
Result := FileExists(ExpandConstant('{tmp}\') + SaveFileName);
end;
end;
//Подгрузка новой страницы-----Start-----
procedure InitializeWizard;
begin
CreateInstallModePage;
with WizardForm do
begin
if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_WMSI', 'WMSI.png') then
begin
lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\WMSI.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, False);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(lPicHandle, True);
ImgApplyChanges(MainPanel.Handle);
end;
end;
end;
//Подгрузка новой страницы-----Finish-----
procedure DeinitializeSetup();
begin
gdipShutDown();
end;
function SetFileAttributes(lpFileName: string; dwFileAttributes: integer): integer;
external 'SetFileAttributes{#A}@kernel32.dll stdcall';
procedure CurStepChanged(CurStep: TSetupStep);
var
RC: integer;
begin
if CurStep = ssInstall then
begin
Exec(ExpandConstant('taskkill'), ' /f /im IconWorkshop.exe', '', SW_HIDE, ewWaitUntilTerminated, RC);
end;
if CurStep = ssDone then
begin
if not IsInPortableMode then
SetFileAttributes((ExpandConstant('{userdocs}\Axialis Librarian\desktop.ini')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
SetFileAttributes((ExpandConstant('{userdocs}\Axialis Librarian\Deleted Items\desktop.ini')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
SetFileAttributes((ExpandConstant('{userdocs}\Axialis Librarian\Icons\desktop.ini')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
SetFileAttributes((ExpandConstant('{userdocs}\Axialis Librarian\Media Files\desktop.ini')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
SetFileAttributes((ExpandConstant('{userdocs}\Axialis Librarian\Media Files\Images\desktop.ini')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
SetFileAttributes((ExpandConstant('{userdocs}\Axialis Librarian\Objects\desktop.ini')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
end;
if CurStep = ssDone then
begin
if not IsInPortableMode then
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1') and not WizardSilent then
MsgBox('Готово!', mbInformation, MB_OK)
else
if not WizardSilent then
MsgBox('Установка {#AppName} была прервана!', mbError, MB_OK);
end;
if CurStep = ssDone then
begin
if IsInPortableMode then
if not WizardSilent then
if FileExists(ExpandConstant('{app}\IconWorkshopPortable.exe' )) then
MsgBox('Готово!', mbInformation, MB_OK)
else
if not FileExists(ExpandConstant('{app}\IconWorkshopPortable.exe' )) then
MsgBox('Установка {#AppName} была прервана!', mbError, MB_OK);
end;
end;
procedure InitializeUninstallProgressForm;
begin
with UninstallProgressForm do
begin
if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_WMSI', 'WMSI.png') then
begin
lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\WMSI.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, False);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(lPicHandle, True);
ImgApplyChanges(MainPanel.Handle);
end;
end;
end;
procedure DeinitializeUninstall();
begin
gdipShutDown();
end;
Egiptyanin245
27-10-2020, 00:43
Приветствую.
У меня такая проблема, имеется программа которая скомпеллирована из двух исполняемых файлов и запускается из экзешника без установки.
При первом ее запуске, в системе на постоянной основе начинает работать исполняемый файл,
и после закрытия программы этот файл остается в работе.
При последующих запусках этой программы, она уже не запускается и выдает ошибку,
так как ей мешает запустившийся исполняемый файл, который начал исполняться во время первого запуска программы.
ВОПРОС, как сделать что бы программа которая скомпеллирована из двух исполняемых файлов и запускается из экзешника без установки, игнорировала файл который ей мешает при повторном запуске или перезаписывала его вновь?
ВОПРОС, как сделать что бы исполняемый файл игнорировался программой при повторном запуске или перезаписывался вновь? »
Переписать:
программа которая скомпеллирована из двух исполняемых файлов и запускается из экзешника без установки. »
Egiptyanin245
28-10-2020, 11:30
не совсем понял что вы имели ввиду? советуете мне исправить формулировку вопроса? если так, то уже исправил.
Вячеслав.Мартыновских@vk
22-11-2020, 00:44
Скиньте плиз все srep и rep одним архивом, и isdone 5 и 6 версию финал
habib2302
22-11-2020, 15:36
Вячеслав.Мартыновских@vk, в https://krinkels.org/ все это есть
niki12899@vk
14-12-2020, 21:35
El Sanchez, Доброго времени суток. Недавно мне скинули сие чудо - http://forum.oszone.net/post-2012750-1182.html
Вопрос был такой:
"Простите за мою тупость, но в коде довольно плохо разбираюсь. Я так понимаю там есть переменные которые зависят от действия? Можно небольшое пояснение к этому коду?
Ну в плане того, как этим пользоваться, что нужно менять и в целом, как это использовать в целях распаковки моего архива.
P.S. я там вижу, что у него есть какая то последовательность. Он сам пакует файл, а потом распаковывает? Или я как обычно несу херню)"
Можете помочь в данном вопросе?
Если вкратце, то меня интересует просто, как сделать бинарник большого размера (что я уже узнал, путём изменения расширения rar на bin) и как его подключить к своему установщику.
El Sanchez
15-12-2020, 16:44
Если вкратце, то меня интересует просто, как сделать бинарник большого размера (что я уже узнал, путём изменения расширения rar на bin) и как его подключить к своему установщику. »
niki12899@vk, архив(ы) вы сами делаете, берёте папки и файлы установленной игры и пакуете их с помощью 7-zip (https://www.7-zip.org/download.html), в один или несколько архивов это решаете вы. Вот вам шаблон, где идет распаковка архива 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'), );
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
[i]{ 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, т.к. я не знаю структуры ваших файлов и папок. Деинсталлятор ничего не знает про извлекаемые из архива файлы, поэтому в ней описываете корневые файлы и папки из архивов.
niki12899@vk
04-01-2021, 18:03
El Sanchez, Видимо я совсем тупой... Простите, можете подробнее процесс описать? Я вставил этот код в Inno Setup. После компиляции создался exe (mySetup) после установки которого создаётся папка "test", где лежит два файла. Но не суть. Я хочу узнать, как мне конкретно подключить свой архив с файлами, чтобы программа потом его распаковывала.
El Sanchez
08-01-2021, 19:06
Простите, можете подробнее процесс описать? Я вставил этот код в Inno Setup. »
niki12899@vk, в CurStepChanged по шаблону ExtractPackage(<путь к файлу архива>, <путь папки для разархивации>) пишете ваши архивы. В примере ExtractPackage распаковывает файл dummy.bin, находящегося рядом с установщиком, в папку установки.
Евгений.Довгополый@vk
22-03-2021, 19:11
Всем Привет. Можете подсказать как написать код : Вот что я хочу. Есть игра. Я сделал к ней дополнение и у меня получилось три папки и в игре есть такие же папки. И мне надо чтоб из моих установилось все туда. А то я не пойму как это сделать.
Евгений.Довгополый@vk
23-03-2021, 03:47
niki12899@vk,
Народ помогите выкачать скрипт пожалуйста с кринкла https://krinkels.org/resources/r-g-mexaniki.82/
очень прошу помочь) можна кинуть на burzabu@gmail.com
burza, читайте: Добавление новой группы и условия перехода в неё, или почему я не могу скачивать без ограничений | Форум Krinkels.org (https://krinkels.org/threads/dobavlenie-novoj-gruppy-i-uslovija-perexoda-v-nejo-ili-pochemu-ja-ne-mogu-skachivat-bez-ogranichenij.4191/).
читайте: Добавление новой группы и условия перехода в неё, или почему я не могу скачивать без ограничений | Форум Krinkels.org. »
и как это должно мне помочь?! Вот я новенький хочу научиться делать репаки, что я могу дать на этом этапе полезного для сообщества если я ничего не заню! откуда у меня там появиться 10 симпатий. треш какой-то. кто может прошу скиньте на почту без вот этого выше.спасибо.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC