Ru-Board.club
← Вернуться в раздел «Программы»

» Inno Setup (создание инсталяционных пакетов)

Автор: serg_aka_lain
Дата сообщения: 03.08.2008 17:04
boss911

Цитата:
Только тут идет поиск класса окна, а мне нужно по имени процесса и без выводимого диалога.


А .dll от Genry -(ISTask.dll) не подходит?.
Автор: boss911
Дата сообщения: 03.08.2008 18:32
serg_aka_lain

Цитата:
А .dll от Genry -(ISTask.dll) не подходит?.

Даже не знаю о чем речь.
Автор: unni
Дата сообщения: 03.08.2008 19:51
Подскажите как по-проще сделать. Есть у меня куча файлов, которые являются библиотекой расширения. При установке они должны быть в определённом месте. Поскольку я не спец по inno, то просто запаковал эту кучу файлов и вложил exe в дистриб с последующим запуском.
По деинсталляции папка очищается и удаляется.
Проблема в том, что в качестве самораспаковывающегося архива я взял winrar'овский sfx, но у него оконный интерфейс с русским языком. Не подскажите, чем сейчас народ решает задачу фоновой распаковки по умолчанию без диалоговых окон, либо если файлов очень много, то стандартное окно в самом inno, но с языковой поддержкой, а были жалобы у меня на раровский распаковчик от забугорных друзей. Всем спасибо. Хотелось бы несколько вариантов, если есть. Папка та содержит очень много текстовых и небольших бинарных файлов.
Автор: serg_aka_lain
Дата сообщения: 03.08.2008 19:53
boss911

Цитата:
Даже не знаю о чем речь.


Сама ISTask.dll есть в наборе "Inno Setup Scripting v5.1\Addons\Libraries\ISTask.dll" от Kindly

-Юзать можно так (пример при удалении [more]
[Files]
Source: "ISTask.dll"; DestDir: "{app}"; Flags: ignoreversion;


[Code]

function KillTaskU(ExeFileName: string): Integer;
external 'KillTask@{app}\ISTask.dll stdcall delayload uninstallonly';


procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usUninstall then
begin
KillTaskU('notepad.exe');
UnloadDll(ExpandConstant('{app}\ISTask.dll'));
end;
end;

[/more] )
Автор: Raf_SE
Дата сообщения: 03.08.2008 20:47
unni, Есть специальная, очень удобная прога для твоего случая, "ISTool" навивается. Она напишет скрипт хоть для миллиона файлов.

Добавлено:
serg_aka_lain, немного нетак как надо [more=твой скрипт]procedure CurStepChanged(CurStep: TSetupStep);
var
ErrorCode: Integer;
begin
if CurStep = ssPostInstall then
begin
if (FileSearch('mscomctl.ocx', ExpandConstant('{sys}')) = '')
or (FileSearch('vb40032.dll', ExpandConstant('{sys}')) = '') then
begin
WizardForm.StatusLabel.Caption := 'Установка Visual Basic 4.0...';
if not Exec(ExpandConstant('{app}') + '\Vbr4\setup.exe', '/q', '', SW_Hide, ewWaitUntilTerminated , ErrorCode) then
begin
WizardForm.Visible := False;
SuppressibleMsgBox('Ошибка запуска установки Visual Basic 4.0', MbCriticalError , MB_OK, MB_Ok);
WizardForm.Visible := True;
end;
end;
end;
end; [/more] работает...
1. Установка Visual Basic почему то запускается в скрытом режиме, но установка VB не автоматическая, юзер должен сделать пару кликов в ней.
2. Нужно чтоб скрипт для VB работал только если выбран компонент "RuText"
3. Нужно чтоб после установки VB запускался
Filename: "{app}\WinMPQ.exe"; Parameters: "s Patch_rt.txt"; StatusMsg: "Русификация текста..."; Flags: runhidden waituntilterminated; Components: RuText;
В смысле WinMPQ должен запускаться позже установки VB, но не зависть от того пытался ли установиться VB или нет, WinMPQ должен запуститься только если выбран компонент "RuText".
Автор: serg_aka_lain
Дата сообщения: 03.08.2008 22:38
Raf_SE

Цитата:
В смысле WinMPQ должен запускаться позже установки VB, но не зависть от того пытался ли установиться VB или нет, WinMPQ должен запуститься только если выбран компонент "RuText".


Пробуй так [more]


[Run]
Filename: "{app}\Vbr4\setup.exe"; WorkingDir: "{app}\Vbr4"; Parameters: "/q"; StatusMsg: "Установка Visual Basic 4.0..."; Components: RuText; Check: CheckVB; Flags: waituntilterminated;
Filename: "{app}\WinMPQ.exe"; Parameters: "s Patch_rt.txt"; StatusMsg: "Русификация текста..."; Flags: runhidden waituntilterminated; Components: RuText;


[Code]

function CheckVB: Boolean;
begin
if IsComponentSelected('RuText') then if (FileSearch('mscomctl.ocx', ExpandConstant('{sys}')) = '')
or (FileSearch('vb40032.dll', ExpandConstant('{sys}')) = '') then Result := True;
end;

[/more]



Автор: unni
Дата сообщения: 03.08.2008 22:40

Цитата:
Raf_SE
Я ей и пользовался, но там очень много файлов с большим деревом каталогов (вложений много, а тулза визуальная не накликаешься ). Может я что-то не понимаю в её пользовании, но мне показалось удобнее заархивировать всё это дело и распаковать и в скрипте все появится всего пару строк по этому поводу.
Автор: Artem_Butenko
Дата сообщения: 03.08.2008 23:48
Victor_Dobrov Пожалуйста, если Вас не затруднит, просмотрите мои вопросы из предыдущего поста, м.б. Вы сталкивались с подобным? Если есть какие-нибудь варианты, буду безгранично рад Вашей помощи!

Добавлено:
Sampron Пожалуйста подскажите где сейчас можно скачать Ваш "Vista Lite Skin"?
Автор: Victor_Dobrov
Дата сообщения: 04.08.2008 06:18
Artem_Butenko
Цитата:
Ребята, кто ранее работал с ISSI возможно сталкивался с примером скрипта, позволяющим с каждой новой страницей выводить новый фоновый рисунок, подскажите можно ли реализовать этот эффект средствами Inno Setup, если использовать .jpeg рисунки (возможно на основе isxbb.dll)?

Вот [more=пример вывода своей картинки]
#define Files "Slides"
#define Mask "*"

#define FindHandle
#define FindResult
#sub ExtractTemporaryFolder
    #emit "    ExtractTemporaryFile('"+ FindGetFileName(FindHandle) +"')"
#endsub
#define LoadImageLib "ImgGdiplus.dll"    ;или IPicture.dll, ImgCtx.dll - идут с программой SBRunScr, или здесь: url=http://victor-dobrov.narod.ru/ImgGdiplus.dll

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[Files]
Source: {#LoadImageLib}; Flags: dontcopy noencryption
Source: {#Files}\{#Mask}; DestDir: {tmp}; Flags: dontcopy

[Code]
type hDC = Longint; TSize = record CX, CY: UInt; end; TagMonitorInfo = record cbSize: DWord; Monitor, Work: TRect; dwFlags: DWord; end;
var MonitorInfo: TagMonitorInfo; BackgroundForm: TForm; BackgroundImage: TBitmapImage; Mem: array[0..31] of Integer; i, n: Integer; FS: TFileStream; Size, PicSize: TSize;
const SRCCOPY = $CC0020;

function GetDC(Wnd: HWnd): hDC; external 'GetDC@user32 stdcall delayload';
function CreateCompatibleDC(DC: hDC): hDC; external 'CreateCompatibleDC@gdi32 stdcall delayload';
function CreateCompatibleBitmap(DC: hDC; Width, Height: Integer): HBitmap; external 'CreateCompatibleBitmap@gdi32 stdcall delayload';
function SelectObject(DC: hDC; p2: LongWord): LongWord; external 'SelectObject@gdi32 stdcall delayload';
function ReleaseDC(Wnd: HWnd; DC: hDC): Longint; external 'ReleaseDC@user32 stdcall delayload';
function DeleteDC(DC: hDC): Boolean; external 'DeleteDC@gdi32 stdcall delayload';
function LoadPicture(Sw: TSize; name: PChar): Longint; external '_LoadPicture@8@files:{#LoadImageLib} stdcall delayload';
procedure StretchImg(Image, hDC: Longint; X,Y,XE,YE, srcX,srcY,srcXE,srcYE: Integer; dwROP: DWord); external '_StretchImg@44@files:{#LoadImageLib} stdcall delayload';
procedure ReleaseImg(LoadedImage: Longint); external '_ReleaseImg@4@files:{#LoadImageLib} stdcall delayload';
function ShowWindow(hWnd, nCmdShow: LongWord): LongWord; external 'ShowWindow@user32';
function GetMonitorInfo(hMonitor: Integer; var lpMonitorInfo: TagMonitorInfo): Boolean; external 'GetMonitorInfoA@user32';

Function ReadFileTag(File, onSet: String; var Tag: String; Buffer: Integer; First: Bool): Integer; var Str: String; Ind, Len: Integer; Begin
    Result:= -1;    FS:= TFileStream.Create(File, fmOpenRead);
if FS.Size < Buffer then Len:= FS.Size - Length(onSet) else Len:= Buffer - Length(onSet)
    for Ind:= 0 to Len do begin    SetLength(Str, Length(onSet))
        FS.Seek(Ind, soFromBeginning)
        FS.ReadBuffer(Str, Length(Str))    //    FS.Position - в следующей позиции
        if Str = onSet then begin Result:= Ind; FS.ReadBuffer(Tag, Length(Tag)); if First then Break; end;
    end;    FS.Free;
End;

Function GetPictureSize(File: String): TSize;    var Buffer: String;    Begin
    Result.CX:= 0; Result.CY:= 0; SetLength(Buffer, $100)    { буфер чтения бинарных данных}
Case Uppercase(ExtractFileExt(File)) of
'.JPG','.JPEG': begin    { тэг JFIF: #FFC2 или #FFC0}
        Mem[11]:= 6; Mem[12]:= 4;    { позиция значений высоты и ширины в формате MotorolaWord}
        n:= ReadFileTag(File, Chr($FF)+Chr($C2), Buffer, $6000, true)    { загрузить в строку данные, если заголовок тэга найден}
        if n < 0 then n:= ReadFileTag(File, Chr($FF)+Chr($C1), Buffer, $4000, true)
        if n < 0 then n:= ReadFileTag(File, Chr($FF)+Chr($C0), Buffer, $8000, false); end;    { расширенный заголовок}
'.BMP':    begin
        Mem[11]:=18; Mem[12]:=22;    n:= ReadFileTag(File, 'BM', Buffer, $200, true); end;
'.GIF':    begin
        Mem[11]:= 4; Mem[12]:= 6;    n:= ReadFileTag(File,'GIF8', Buffer, $200, true); end;
'.PNG':    begin
        Mem[11]:=15; Mem[12]:=19;    n:= ReadFileTag(File, 'PNG', Buffer, $200, true); end;
end;
        if n < 0 then begin MsgBox('Unknown Picture Size!', mbError, MB_OK); end;
    if (Uppercase(ExtractFileExt(File)) = '.BMP') or (Uppercase(ExtractFileExt(File)) = '.GIF') then n:= -1 else n:= 1 { для Bmp и Gif менять мл. и ст. байт}
Result.CX:= Ord(Buffer[Mem[11]]) shl 8 + Ord(Buffer[Mem[11]+n]); Result.CY:= Ord(Buffer[Mem[12]]) shl 8 + Ord(Buffer[Mem[12]+n])
End;

Procedure PictureToBitmap(Parent: TWinControl; Bitmap: TBitmapImage; File: String); var PicStream, MemDC, WinDC: hDC; tmpBitmap: HBitmap; Begin
    Size.CX:= Bitmap.Width; Size.CY:= Bitmap.Height;
    PicSize:= GetPictureSize(File)
    PicStream:= LoadPicture(Size, File);
    WinDC:= GetDC(Parent.Handle);
    MemDC:= CreateCompatibleDC(WinDC);
    tmpBitmap:= CreateCompatibleBitmap(WinDC, Size.CX, Size.CY);
    SelectObject(MemDC, tmpBitmap);    { чтобы рисовать, нужно выбрать битмап в контекст, но напрямую не рисуется, поэтому используется временный}
    StretchImg(PicStream, MemDC, 0, 0, Size.CX, Size.CY, 0, 0, PicSize.CX, PicSize.CY, SRCCOPY);
    Bitmap.Bitmap.Handle:= tmpBitmap;
DeleteDC(MemDC); ReleaseDC(Parent.Handle, WinDC); ReleaseImg(PicStream); Parent.Invalidate;
End;

Procedure BackgroundOnActivate(Sender: TObject); Begin if WizardForm.Visible then WizardForm.Show End;

Procedure ShowPageImage(CurPageID: Integer); var picFile, res, str, Mask: String; Begin
    str:= 'jpg|jpeg|bmp|png|gif'; //    WizardForm.Caption:= 'фон для этой страницы: '+ IntToStr(CurPageID) +'.'+ str
Repeat
    res:=str; str:= Copy(str, Pos('|', str)+1, Length(str))
    if Length(res) <= Length(str) then Mask:= res else Mask:= Copy(res, 1, Length(res) - Length(str) -1)
    picFile:= AddBackslash(ExpandConstant('{tmp}')) + IntToStr(CurPageID) +'.'+ Mask
    if FileExists(picFile) then begin
        BackgroundImage.SetBounds(0,0, MonitorInfo.Monitor.Right, MonitorInfo.Monitor.Bottom)
        PictureToBitmap(BackgroundForm, BackgroundImage, picFile);
        ShowWindow(BackgroundForm.Handle, sw_ShowMaximized)    // фоновое окно на полный экран
        Exit;    // картинка найдена, следующие можно не искать...
    end ShowWindow(BackgroundForm.Handle, sw_Hide)    //скрыть фон, если картинка для новой страницы не найдена
Until Length(res) = Length(str)    { поиск файлов в папке выполняется для каждой маски}
End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
    ShowPageImage(CurPageID)
End;

Procedure InitializeWizard;
Begin
    #for {FindHandle = FindResult = FindFirst(".\" + AddBackslash(Files) + Mask, 0); FindResult; FindResult = FindNext(FindHandle)} ExtractTemporaryFolder
BackgroundForm:= TForm.Create(nil)
    BackgroundForm.Caption:= WizardForm.Caption
    BackgroundForm.BorderStyle:= bsNone    { убрать для показа заголовка}
    BackgroundForm.OnActivate:= @BackgroundOnActivate;
MonitorInfo.cbSize:= SizeOf(MonitorInfo); GetMonitorInfo(1, MonitorInfo)
BackgroundImage:= TBitmapImage.Create(BackgroundForm);
    BackgroundImage.Parent:= BackgroundForm;
End;

Procedure DeinitializeSetup; Begin BackgroundForm.Free; End;
[/more] для каждой страницы, за основу взят скрипт загрузки рисунка в фоновое окно.
Грузятся картинки с расширением jpeg, gif, png, bmp. Имена файлов должны быть формата CurPageID.расширение.
Библиотека ImgGdiPlus.dll имеется в комплекте Corona Skin или здесь.
Автор: Artem_Butenko
Дата сообщения: 04.08.2008 10:56
Victor_Dobrov. Большое спасибо, хотя директивы препроцессора для меня пока сложны, но буду постепенно в них разбираться!
Автор: nOobCrafter
Дата сообщения: 04.08.2008 11:13
Времени доброго, у меня вот есть [more=код][Files]
Source: "compiler:Examples\MyProg.exe"; DestDir: {app}; BeforeInstall: CreateBackup

[Tasks]
Name: arc; Description: "Создать резервную копию"; GroupDescription: "Дополнительные задания:"

[_Code]
procedure CreateBackup();
var
SrcFile, DestFile: string;
begin
if IsTaskSelected('arc') then
begin
// if Not DirExists(ArcDir) then CreateDir(ArcDir);
ForceDirectories(ArcDir); // исправлено
SrcFile:= AddBackslash(ExpandConstant('C:\123\')) + ExtractFileName(CurrentFileName);
DestFile:= AddBackslash(ArcDir) + ExtractFileName(CurrentFileName);
FileCopy(SrcFile, DestFile, False);
end;
end;

Procedure InitializeWizard;
    Begin
Page1:= CreateInputDirPage(wpSelectTasks, 'Создание резервной копии.',
'Выберите расположение резервной копии.',
'Для продолжения нажмите "Далее"' + #10#13#10#13 +
'Если необходимо выполнить установку в другую папку, нажмите «Обзор» или напишите путь в строке ввода.',
False, 'Backup');
Page1.Add('');
Page1.Values[0] := AddBackslash(ExpandConstant('C:\BackUp')) +
GetDateTimeString('yyyy/mm/dd hh:nn', '_', '.' ); [/more] такого содержания, что то вот никак непойму что в нем нетак и чего он нехочет корректно бэкапить конкретную папку( то есть со всем содержимым)((( если делать такой вариант

Код: procedure CreateBackup();
var
SrcFile, DestFile: string;
begin
if IsTaskSelected('arc') then
begin
BackupDir(ExpandConstant('C:\123'), 'C:\BackUp', False);
end;
end;
Автор: Genri
Дата сообщения: 04.08.2008 11:27
abasov

Цитата:
как проверить доступность хоста (ping)?
-- самое простое - анализировать время прохождения пинга. Но это не так интересно. Интересней использовать [more=такой]
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DirExistsWarning=no
DefaultDirName={pf}\My Program

[_Code]
const
PING_TIMEOUT = 500;
INADDR_NONE = $FFFFFFFF;
SOCKET_ERROR = (-1);

IP_SUCCESS = 0;
IP_BUF_TOO_SMALL = (11000 + 1);
IP_DEST_NET_UNREACHABLE = (11000 + 2);
IP_DEST_HOST_UNREACHABLE = (11000 + 3);
IP_DEST_PROT_UNREACHABLE = (11000 + 4);
IP_DEST_PORT_UNREACHABLE = (11000 + 5);
IP_NO_RESOURCES = (11000 + 6);
IP_BAD_OPTION = (11000 + 7);
IP_HW_ERROR = (11000 + 8);
IP_PACKET_TOO_BIG = (11000 + 9);
IP_REQ_TIMED_OUT = (11000 + 10);
IP_BAD_REQ = (11000 + 11);
IP_BAD_ROUTE = (11000 + 12);
IP_TTL_EXPIRED_TRANSIT = (11000 + 13);
IP_TTL_EXPIRED_REASSEM = (11000 + 14);
IP_PARAM_PROBLEM = (11000 + 15);
IP_SOURCE_QUENCH = (11000 + 16);
IP_OPTION_TOO_BIG = (11000 + 17);
IP_BAD_DESTINATION = (11000 + 18);
IP_ADDR_DELETED = (11000 + 19);
IP_SPEC_MTU_CHANGE = (11000 + 20);
IP_MTU_CHANGE = (11000 + 21);
IP_UNLOAD = (11000 + 22);
IP_ADDR_ADDED = (11000 + 23);
IP_GENERAL_FAILURE = (11000 + 50);
IP_PENDING = (11000 + 255);

type
ICMP_OPTIONS = record
Ttl : Byte;
Tos : Byte;
Flags : Byte;
OptionsSize : Byte;
OptionsData : Longint;
end;

ICMP_ECHO_REPLY = record
Address : Longint;
status : Longint;
RoundTripTime : Longint;
DataSize : Longint;
Reserved : Integer;
DataPointer : Longint;
Options : ICMP_OPTIONS;
Data : string;
end;

function IcmpCreateFile(): HWND;
external 'IcmpCreateFile@icmp.dll stdcall';

function IcmpCloseHandle(IcmpHandle: Longint): Longint;
external 'IcmpCloseHandle@icmp.dll stdcall';

function IcmpSendEcho(IcmpHandle: HWND;
DestinationAddress: Longint;
RequestData: string;
RequestSize: Longint;
RequestOptions: Longint;
var ReplyBuffer: ICMP_ECHO_REPLY;
ReplySize: Longint;
Timeout: Longint): Longint;
external 'IcmpSendEcho@icmp.dll stdcall';
// external 'IcmpSendEcho@iphlpapi.dll stdcall';

function inet_addr(sAddr: string): Longint;
external 'inet_addr@wsock32.dll stdcall';

function GetPingResult(status: Longint): string;
begin
case status of
IP_SUCCESS: Result:= 'Ping IP: success';
IP_BUF_TOO_SMALL: Result:= 'Ping IP: buf too small';
IP_DEST_NET_UNREACHABLE: Result:= 'Ping IP: destination net unreachable';
IP_DEST_HOST_UNREACHABLE: Result:= 'Ping IP: destination host unreachable';
IP_DEST_PROT_UNREACHABLE: Result:= 'Ping IP: destination protocol unreachable';
IP_DEST_PORT_UNREACHABLE: Result:= 'Ping IP: destination port unreachable';
IP_NO_RESOURCES: Result:= 'Ping IP: no resources';
IP_BAD_OPTION: Result:= 'Ping IP: bad option';
IP_HW_ERROR: Result:= 'Ping IP: hardware error';
IP_PACKET_TOO_BIG: Result:= 'Ping IP: packet too big';
IP_REQ_TIMED_OUT: Result:= 'Ping IP: request timed out';
IP_BAD_REQ: Result:= 'Ping IP: bad request';
IP_BAD_ROUTE: Result:= 'Ping IP: bad route';
IP_TTL_EXPIRED_TRANSIT: Result:= 'Ping IP: ttl expired transit';
IP_TTL_EXPIRED_REASSEM: Result:= 'Ping IP: ttl expired reassem';
IP_PARAM_PROBLEM: Result:= 'Ping IP: parameter problem';
IP_SOURCE_QUENCH: Result:= 'Ping IP: source quench';
IP_OPTION_TOO_BIG: Result:= 'Ping IP: option too big';
IP_BAD_DESTINATION: Result:= 'Ping IP: bad destination';
IP_ADDR_DELETED: Result:= 'Ping IP: address deleted';
IP_SPEC_MTU_CHANGE: Result:= 'Ping IP: spec mtu change';
IP_MTU_CHANGE: Result:= 'Ping IP: mtu change';
IP_UNLOAD: Result:= 'Ping IP: unload';
IP_ADDR_ADDED: Result:= 'Ping IP: address added';
IP_GENERAL_FAILURE: Result:= 'Ping IP: general failure';
IP_PENDING: Result:= 'Ping IP: pending';
INADDR_NONE: Result:= 'Ping IP: bad IP format';
SOCKET_ERROR: Result:= 'Ping IP: can''t open port';
else Result:= 'Unknown status';
end;

end;

function Ping(sAddr, sendData: string): Longint;
var
hPort: HWND;
dwAddr: Longint;
ECHO: ICMP_ECHO_REPLY;
begin
dwAddr:= inet_addr(sAddr);
if dwAddr <> INADDR_NONE then
begin
hPort:= IcmpCreateFile();
if hPort <> 0 then
begin
IcmpSendEcho(hPort, dwAddr, sendData, Length(sendData),
0, ECHO, SizeOf(ECHO), PING_TIMEOUT);
IcmpCloseHandle(hPort);

Result:= ECHO.status;
end
else Result:= SOCKET_ERROR;
end
else Result:= INADDR_NONE;
end;

procedure InitializeWizard();
var
str: string;
res: Longint;
begin
res:= Ping('172.31.100.1', 'test');
str:= GetPingResult(res);
MsgBox(str, mbInformation, MB_OK);
end; [/more] вариант.
Автор: ExpeditorR
Дата сообщения: 04.08.2008 12:00
Artem_Butenko
Предлагаю вам ещё один гораздо более простой вариант показа jpeg картинок для каждой новой страницы.[more=пример][Setup]
SourceDir=.
OutputDir=Setup
AppName=pictures
AppVerName=pictures
AppVersion=pictures
DefaultDirName={pf}\pictures
DefaultGroupName=pictures
AllowNoIcons=yes
OutputBaseFilename=setup
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
Compression=zip
SlicesPerDisk=1

[Icons]
Name: "{group}\{cm:UninstallProgram,pictures}"; Filename: "{uninstallexe}"

[UninstallDelete]
Type: filesandordirs; Name: "{app}"

[Files]
Source: "C:\anyfiles\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension
Source: BackImage.jpg; DestDir: {tmp}; Flags: dontcopy
Source: isjpgtobmp.dll; DestDir: {tmp}; Flags: dontcopy
Source: 1.jpg; DestDir: {tmp}; Flags: dontcopy
Source: 2.jpg; DestDir: {tmp}; Flags: dontcopy
Source: 3.jpg; DestDir: {tmp}; Flags: dontcopy
Source: 4.jpg; DestDir: {tmp}; Flags: dontcopy
Source: 5.jpg; DestDir: {tmp}; Flags: dontcopy
Source: 6.jpg; DestDir: {tmp}; Flags: dontcopy
Source: 7.jpg; DestDir: {tmp}; Flags: dontcopy
Source: 8.jpg; DestDir: {tmp}; Flags: dontcopy
Source: 9.jpg; DestDir: {tmp}; Flags: dontcopy
Source: 10.jpg; DestDir: {tmp}; Flags: dontcopy
Source: 11.jpg; DestDir: {tmp}; Flags: dontcopy
Source: 12.jpg; DestDir: {tmp}; Flags: dontcopy
Source: 13.jpg; DestDir: {tmp}; Flags: dontcopy
Source: 14.jpg; DestDir: {tmp}; Flags: dontcopy

[Code]
var
BackImage: TBitmapImage;
path,Pics: string;

function GetSystemMetrics(nIndex:Integer):Integer; external 'GetSystemMetrics@user32.dll stdcall';
procedure convertjpgtobmp(p: String); external 'convertjpgtobmp@files:isjpgtobmp.dll stdcall';

procedure nextimage(ID: integer);
begin
if ID=wpWelcome then BackImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\1.bmp ');
if ID=wpLicense then BackImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\2.bmp ');
if ID=wpPassword then BackImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\3.bmp ');
if ID=wpInfoBefore then BackImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\4.bmp ');
if ID=wpUserInfo then BackImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\5.bmp ');
if ID=wpSelectDir then BackImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\6.bmp ');
if ID=wpSelectComponents then BackImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\7.bmp ');
if ID=wpSelectProgramGroup then BackImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\8.bmp ');
if ID=wpSelectTasks then BackImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\9.bmp ');
if ID=wpReady then BackImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\10.bmp ');
if ID=wpPreparing then BackImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\11.bmp ');
if ID=wpInstalling then BackImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\12.bmp ');
if ID=wpInfoAfter then BackImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\13.bmp ');
if ID=wpFinished then BackImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\14.bmp ');
end;

procedure InitializeWizard();
begin
WizardForm.Position:=poScreenCenter
WizardForm.CancelButton.BringToFront;
MainForm.BORDERSTYLE:=bsNone
MainForm.Left:=0
MainForm.Top:=0
MainForm.Width:=GetSystemMetrics(0)
MainForm.Height:=GetSystemMetrics(1)
ExtractTemporaryFile('BackImage.jpg')
pics:=ExpandConstant('{tmp}')+'\BackImage.jpg ';
convertjpgtobmp(pics);
BackImage:=TBitmapImage.Create(MainForm)
BackImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\BackImage.bmp ')
BackImage.Align:=alClient
BackImage.Parent:=MainForm
BackImage.Stretch:=True
MainForm.Visible:=True
path:=ExpandConstant('{tmp}');
ExtractTemporaryFile('1.jpg')
ExtractTemporaryFile('2.jpg')
ExtractTemporaryFile('3.jpg')
ExtractTemporaryFile('4.jpg')
ExtractTemporaryFile('5.jpg')
ExtractTemporaryFile('6.jpg')
ExtractTemporaryFile('7.jpg')
ExtractTemporaryFile('8.jpg')
ExtractTemporaryFile('9.jpg')
ExtractTemporaryFile('10.jpg')
ExtractTemporaryFile('11.jpg')
ExtractTemporaryFile('12.jpg')
ExtractTemporaryFile('13.jpg')
ExtractTemporaryFile('14.jpg')
pics:=path+'\1.jpg';
convertjpgtobmp(pics);
pics:=path+'\2.jpg';
convertjpgtobmp(pics);
pics:=path+'\3.jpg';
convertjpgtobmp(pics);
pics:=path+'\4.jpg';
convertjpgtobmp(pics);
pics:=path+'\5.jpg';
convertjpgtobmp(pics);
pics:=path+'\6.jpg';
convertjpgtobmp(pics);
pics:=path+'\7.jpg';
convertjpgtobmp(pics);
pics:=path+'\8.jpg';
convertjpgtobmp(pics);
pics:=path+'\9.jpg';
convertjpgtobmp(pics);
pics:=path+'\10.jpg';
convertjpgtobmp(pics);
pics:=path+'\11.jpg';
convertjpgtobmp(pics);
pics:=path+'\12.jpg';
convertjpgtobmp(pics);
pics:=path+'\13.jpg';
convertjpgtobmp(pics);
pics:=path+'\14.jpg';
convertjpgtobmp(pics);
end;

procedure CurPageChanged(CurPageID: Integer);
begin
nextimage(CurPageID);
If CurPageID=wpInstalling then
begin
WizardForm.MainPanel.Visible:=False;
WizardForm.Bevel1.Visible:=False;
WizardForm.Width:=ScaleX(395);
WizardForm.Height:=ScaleY(142);
WizardForm.Left:=ScaleX(MainForm.Width-WizardForm.Width-25);
WizardForm.Top:=ScaleY(MainForm.Height-WizardForm.Height-25);
WizardForm.InnerNotebook.Left:=ScaleX(10);
WizardForm.InnerNotebook.Top:=ScaleY(10);
WizardForm.InnerNotebook.Width:=ScaleX(370);
WizardForm.StatusLabel.Left:=ScaleX(0);
WizardForm.StatusLabel.Top:=ScaleY(0);
WizardForm.StatusLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.FileNameLabel.Left:=ScaleX(0);
WizardForm.FileNameLabel.Top:=ScaleY(20);
WizardForm.FileNameLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.ProgressGauge.Top:=ScaleY(40);
WizardForm.ProgressGauge.Width:=WizardForm.InnerNotebook.Width;
WizardForm.CancelButton.Left:=ScaleX(154);
WizardForm.CancelButton.Top:=ScaleY(80);
end

if CurPageID=wpFinished then
begin
WizardForm.Visible:=False;
WizardForm.Width:=502;
WizardForm.Height:=392;
WizardForm.Left:=(MainForm.Width-WizardForm.Width) div 2;
WizardForm.Top:=(MainForm.Height-WizardForm.Height) div 2;
WizardForm.Visible:=True;
BackImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\BackImage.bmp')
end
end;
[/more]

Просто уберите из примера все не нужные картинки. isjpgtobmp.dll можно скачать здесь
P.S.
Victor_Dobrov Забыл сказать, что его вариант не будет работать в Win 98, WinMe, так как в них отсутствует gdiplus.dll размером около 1,7мб (не путать с ImgGdiPlus.dll). уж не знаю насколько это для вас критично, лично для меня критично.
Автор: Artem_Butenko
Дата сообщения: 04.08.2008 13:09
ExpeditorR Спасибо за помощь, Ваш вариант (не в обиду Виктору) достаточно интересный, только вот жалко, что нельзя использовать другие графические форматы (кроме .jpeg). Но, все равно, Вам ExpeditorR и Victor_Dobrov большое человеческое спасибо!
Автор: GRom V
Дата сообщения: 04.08.2008 14:22
Всеж....может кто нить ответит на мой вопрос???

Подскажите Плизз...- мне после инсталляции необходимо удалить ветку реестра [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-21-282464564-3822681427-9964723-1000\test
Но параметр \S-1-5-21-282464564-3822681427-9964723-1000\ может быть какой угодно. Как можно удалить этот \test ???

Добавлено:
Вопрос 2...Можно ли выполнить остановку/запуск служб средствами Inno например net stop uxsms .... net start uxsms
Автор: Genri
Дата сообщения: 04.08.2008 14:50
GRom V -- указанная тобой строка (S-1-5-21-282464564-3822681427-9964723-1000) - это не параметр, и он не может быть любой. Это идентификатор безопасности (SID, security ID), идентифицирующий пользователя, группу или компьютер. Все валидные сиды на конкретном компе, ты можешь найти в HKLM\SOFTWARE\ Microsoft\Windows NT\CurrentVersion\ProfileList.

По поводу net stop и net start - можешь смело использовать, при условии, что будешь задавать не имя сервиса, а отображаемое имя (кажется так. посмотри по старым веткам). Только это называется не средствами инно, а средствами операционной системы.
Автор: Victor_Dobrov
Дата сообщения: 04.08.2008 14:59
ExpeditorR
Цитата:
Предлагаю вам ещё один гораздо более простой вариант показа jpeg картинок для каждой новой страницы

Зато добавляет к инсталлятору около 80 Кб (против 2 Кб), работает только с jpeg и медленнее, а также подготовка скрипта сложнее, надо прописывать каждый файл, а у меня всё добавляется и показывается без изменений в скрипте.

Цитата:
Забыл сказать, что его вариант не будет работать в Win 98, WinMe, так как в них отсутствует gdiplus.dll размером около 1,7мб

Неверно. Достаточно указать в LoadImageLib библиотеку IPicture.dll, и картинки jpg, bmp, gif и png будут загружаться без проблем.

Artem_Butenko
Небольшое исправление для правильной загрузки jpeg-файлов со сложным тэгом:

старый код скрипта:
n:= ReadFileTag(File, Chr($FF)+Chr($C2), Buffer, $6000, true)
исправленный:
n:= ReadFileTag(File, Chr($FF)+Chr($C2), Buffer, $C000, true)
Автор: ExpeditorR
Дата сообщения: 04.08.2008 16:19
Victor_Dobrov

Цитата:
Неверно. Достаточно указать в LoadImageLib библиотеку IPicture.dll, и картинки jpg, bmp, gif и png будут загружаться без проблем.


Хорошо коли так

Цитата:
медленнее, а также подготовка скрипта сложнее

Тут я бы возразил.
Скажу что - зато все картинки отображаются штатными средствами, а это уже не мало, меньше лишних вычислений, меньше зависимостей, проще масштабировать картинки, меньше подводных камней сторонних dll, и всё это=стабильность. А скрипт подготовить не сложней чем обычный.

Вобщем всё это дело вкуса, кому как проще.
Предлагаю не ссориться и закрыть тему споров, и ехать дальше. Ибо я задевать за живое никого не хотел.




Автор: equis
Дата сообщения: 04.08.2008 18:18
Для тех, кто использует китайскую сборку innounp с расширенными возможностями - появилась обновленная версия. В ней исправлены баги в работе с ключом -r и оптимизирован код.

innounp enhanced v0.23 build 2008-06-25

Добавил в архив хелп-файл с пояснениями.
Автор: Gans123
Дата сообщения: 04.08.2008 21:28
Подскажите пожалуйста. Я создал скрипт и начал компилировать файлы и перед самым концом он мне выдает: "Disk spanning must be enabled in order to create an installation larget than 2100000000 bytes in size"

На винте места более 30 гб

Вот сам скрипт:
Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

[Setup]
AppName=Lineage 2
AppVerName=Lineage 2 Interlude
AppPublisher=CH1PSET
DefaultDirName=D:\Games\Lineage 2 Interlude
DefaultGroupName=Lineage 2 Interlude
LicenseFile=D:\Distr Games\.txt
InfoAfterFile=D:\Distr Games\1.txt
OutputDir=D:\
OutputBaseFilename=Setup L2 Interlude
SetupIconFile=C:\Program Files\NSIS\Contrib\Graphics\Icons\modern-install-full.ico
Compression=lzma
SolidCompression=true
AppCopyright=CH1PSET
UninstallDisplayIcon={app}\L2.exe

[Languages]
Name: english; MessagesFile: compiler:Default.isl
Name: russian; MessagesFile: compiler:Languages\Russian.isl

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked

[Files]
Source: D:\Distr Games\Lineage2-Interlude_[tfile.ru]\system\L2.exe; DestDir: {app}; Flags: ignoreversion; Tasks: ; Languages:
Source: D:\Distr Games\Lineage2-Interlude_[tfile.ru]\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: {group}\Lineage 2; Filename: {app}\System\L2.exe
Name: {group}\{cm:UninstallProgram,Lineage 2}; Filename: {uninstallexe}
Name: {commondesktop}\Lineage 2; Filename: {app}\System\L2.exe; Tasks: desktopicon
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\Lineage 2; Filename: {app}\System\L2.exe; Tasks: quicklaunchicon

[Run]
Filename: {app}\L2.exe; Description: {cm:LaunchProgram,Lineage 2}; Flags: nowait postinstall skipifsilent



Спасибо. И можно ответ по конкретнее.
Автор: Artem_Butenko
Дата сообщения: 04.08.2008 21:59
Gans123 вероято Вы собираете инсталлятор игры общим объемом более ~2,5 Гб. В таком случае включите в секции [Setup] "разбиение на диски" и произвольно назначьте "размер архива" (желательно не более 2 Гб). Более подробно об этом можно узнать из русской справки к Inno Setup от Bagira (см. шапку форума). Рекомендую подробно изучить информацию о параметрах секции [Setup] и Ваш вопрос разрешится в ту же минуту! Если предельно конкретно, то обратите внимание на параметры: DiskSliceSize и DiskSpanning из секции [Setup]!
Автор: Sampron
Дата сообщения: 04.08.2008 23:52
Artem_Butenko
Немогу найти этот скин, наверно снёс, возьми из последнего руководства от Kindly.
Автор: Artem_Butenko
Дата сообщения: 05.08.2008 00:32
Sampron Прошу извинить меня за упертость, но, в каком именно руководстве от Kindly (в версии 5.1 находятся скины иммитирующие InstallShield) расположен Ваш "Vista Lite Skin"? Очень сильно хочется его изучить! И, если не сложно, помогите назначить битмапу 164x314 свойство Border. Об этом я интересовался еще в предыдущем посте. Заранее большое спасибо!
Автор: Victor_Dobrov
Дата сообщения: 05.08.2008 01:28
Artem_Butenko - если Sampron не будет против, то пусть Vista Lite Skin пока находится здесь.
Автор: Sampron
Дата сообщения: 05.08.2008 01:46
Victor_Dobrov
Почему против, наоборот пускай будет стабильная ссылка!
Artem_Butenko

Цитата:
помогите назначить битмапу 164x314 свойство Border

У битмапа нет такого свойства, тут тебе поможет Paint.
Автор: GRom V
Дата сообщения: 05.08.2008 04:43
Genri

Цитата:
GRom V -- указанная тобой строка (S-1-5-21-282464564-3822681427-9964723-1000) - это не параметр, и он не может быть любой. Это идентификатор безопасности (SID, security ID), идентифицирующий пользователя, группу или компьютер. Все валидные сиды на конкретном компе, ты можешь найти в HKLM\SOFTWARE\ Microsoft\Windows NT\CurrentVersion\ProfileList.

По поводу net stop и net start - можешь смело использовать, при условии, что будешь задавать не имя сервиса, а отображаемое имя (кажется так. посмотри по старым веткам). Только это называется не средствами инно, а средствами операционной системы.


Возможно я не правильно выразился (S-1-5-21-282464564-3822681427-9964723-1000) - да это сид. Под словами "он может быть любой" я имел ввиду что он генерируется инстяллятором. На моем компе он такой, если снести и установить заново - он будет другим. Как и на другом компе. Вопрос как можно в ветке
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-21-282464564-3822681427-9964723-1000\test
Удалить \test - если я незнаю какой сид? Надеюсь мысль понятна.

По поводу net stop и net start - опять не так выразился, за что прошу просчения, под словами средствами инно - имелось ввиду как осуществить это в инно? Батником проблем нет, а вот как сделать инновским способом без батника - у меня загвоздка.
Спасибо...
Автор: SotM
Дата сообщения: 05.08.2008 09:40
GRom V

Цитата:
По поводу net stop и net start - опять не так выразился, за что прошу просчения, под словами средствами инно - имелось ввиду как осуществить это в инно? Батником проблем нет, а вот как сделать инновским способом без батника - у меня загвоздка.


А что, разве нельзя использовать функцию Exec?
В хелпе ведь написано:

Код: var
ResultCode: Integer;
begin
// Launch Notepad and wait for it to terminate
if Exec(ExpandConstant('{win}\notepad.exe'), '', '', SW_SHOW,
ewWaitUntilTerminated, ResultCode) then
begin
// handle success if necessary; ResultCode contains the exit code
end
else begin
// handle failure if necessary; ResultCode contains the error code
end;
end;
Автор: SiberianGRemlin
Дата сообщения: 05.08.2008 09:47
Скажите, пожалуйста, как правильно импортировать функцию SendMessage. И какое значение у константы BM_CLICK, если я правильно понял, $F5 ?

Прошу прощения, сам отвечу на свой вопрос:
Цитата:
function SendMessage(Wnd: HWnd; Msg, wParam: Word; lParam: Longint): Longint;
external 'SendMessageA@user32.dll stdcall';
Автор: SotM
Дата сообщения: 05.08.2008 10:29

Цитата:
Скажите, пожалуйста, как правильно импортировать функцию SendMessage. И какое значение у константы BM_CLICK, если я правильно понял, $F5 ?

Для начала нужно воспользоваться поиском, т.к. это уже здесь обсуждали.

Первый попавшийся [more=пример]

Код:
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[no][Code][/no]
const
BM_CLICK = $F5;
WM_GETTEXT = $D;
WM_GETTEXTLENGTH = $E;

function FindWindowEx(hWndM, hWndC: LongWord; lpszClass, lpszWindow: PChar): LongWord;
external 'FindWindowExA@user32.dll stdcall';

procedure InitializeWizard();
var
ResultCode: Integer;
AppWnd, EditWnd: LongWord;
length: LongInt;
Text: String;
begin
if Exec(ExpandConstant('{sys}\calc.exe'), '', '', SW_SHOW,
ewWaitUntilIdle, ResultCode) then
begin
AppWnd:= FindWindowByWindowName('Calculator');
if AppWnd <> 0 then
begin
SendMessage(FindWindowEx(AppWnd, 0, 'Button', '7'), BM_CLICK, 0, 0);
SendMessage(FindWindowEx(AppWnd, 0, 'Button', '/'), BM_CLICK, 0, 0);
SendMessage(FindWindowEx(AppWnd, 0, 'Button', '8'), BM_CLICK, 0, 0);
SendMessage(FindWindowEx(AppWnd, 0, 'Button', '='), BM_CLICK, 0, 0);

EditWnd:= FindWindowEx(AppWnd, 0, 'EDIT', '');
length:= SendMessage(EditWnd, WM_GETTEXTLENGTH, 0, 0);
Text:= StringOfChar(' ', length);
SendMessage(EditWnd, WM_GETTEXT, length, CastStringToInteger(Text));

MsgBox(Text, mbInformation, MB_OK);
end;
end;
end;
Автор: nOobCrafter
Дата сообщения: 05.08.2008 10:43
Люди помоги плиз с таким вопросом, вот есть 2 функции

Цитата:
BackupDir(ExpandConstant('{app}'), 'C:\BackUp', False);

RenameDir(ExpandConstant('{app}'), ExpandConstant('{app}' + ' -' + GetDateTimeString('dd/mm/yyyy hh:nn:ss ', '-', '-') + '\'));

, нужно что бы, папка бэкапилась в отдельную директорию (C:\BackUp) и к ее имени добалялась бы дата\время, как в функции RenameDir? Надо как то совместить эти 2 функции что бы получилась одна, или снизу есть скрип с тем еффектом что надо, но там свои траблы..

И вопрос по поводу "InnoSetupFAQ_ru-board.chm"
[more=вот][Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
Compression=lzma
SolidCompression=yes
Uninstallable=no

[Tasks]
Name: arc; Description: "Create backup"

[Files]
Source: Files\*.*; DestDir: {app}; BeforeInstall: CreateBackup

[Code]
var
Page: TInputDirWizardPage;
ArcDir: String;

procedure CreateBackup();
var
SrcFile, DestFile: string;
begin
if IsTaskSelected('arc') then
begin
// if Not DirExists(ArcDir) then CreateDir(ArcDir);
ForceDirectories(ArcDir); // исправлено
SrcFile:= AddBackslash(ExpandConstant('{app}')) + ExtractFileName(CurrentFileName);
DestFile:= AddBackslash(ArcDir) + ExtractFileName(CurrentFileName);
FileCopy(SrcFile, DestFile, False);
end;
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
If (CurPageID = Page.ID) then
ArcDir := Page.Values[0];
Result:= True;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
If (PageID = Page.ID) and
(Not IsTaskSelected('arc')) then
Result:= True
else Result:= False;
end;

procedure InitializeWizard();
begin
Page:= CreateInputDirPage(wpSelectTasks, 'Select Backup Location',
'Where should backup files be stored?',
'To continue, click Next.' + #10#13#10#13 +
'If you would like to select a different folder, click Browse.',
False, 'Backup');
Page.Add('');
//Page.Values[0] := ExpandConstant('{sd}\Backup');
Page.Values[0] := AddBackslash(ExpandConstant('{sd}\Backup')) +
GetDateTimeString('yyyy/mm/dd hh:nn', '_', '.' ); // исправлено
end; [/more] код оттуда, почему с его помошью нельзя забэкапить "любую" папку, а только ходящую в состав инсталяшки? Я допустим хочу сделать бэкап рабочего стола при инстале проги (для примера говорю, хоть C:\123), а этого неполучается, в {sd}\Backup создается папка со временем инстала, но она пуста( Как можно это реализовать?

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970

Предыдущая тема: Презентация


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.