PDA

Показать полную графическую версию : [архив] Inno Setup .:[все вопросы]:.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 [30] 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

Serega
08-04-2009, 20:29
Converter - конвертирует reg-файлы в формат *.iss (формат скриптов Inno Setup).

Пользоваться очень просто:
Нажимаете кнопку "Выбрать файл", в диалоге выбираете reg-файл и после завершения работы программы, рядом с reg-файлом, будет создан файл с таким же именем, но иметь расширение *.iss


Корректно читаются и конвертируются из HEX данных в читаемый вид, значения ключей REG_EXPAND_SZ (expandsz) и REG_MULTI_SZ (multisz);
Добавлена поддержка удаления веток и параметров (записи вида [-ветка] и "параметр"=-);
Добавлена возможность интеграции в контекстное меню;
Добавлена функция drag&drop, т.е. reg-файл можно перетащить мышкой на форму и программа конвертирует его;
Добавлена возможность закрыть программу, после конвертирования;
Добавлена возможность использования флагов и констант;
Добавлена возможность открыть файл, после конвертирования;
Все неподдерживаемые в Inno Setup ключи реестра, теперь прописываются в секции кода;
Оптимизирован код программы и изменено оформление;

Исправлена ошибка с преобразованием: HKEY_LOCAL_MACHINE -> HKLM;
Исправлена ошибка, связанная с пустыми данными в reg-файле;
Убрал ограничение на размер входного reg-файла;
Исправлены мелкие недочёты и ошибки;

P.S.
Если вы заметили, что программа работает не корректно или с ошибками, пожалуйста напишите мне об этом.

boss911
08-04-2009, 20:42
Сделал небольшую программу Converter - конвертирует reg-файлы в формат *.iss »
Штука полезная, конечно. Но ведь зачем, когда есть ISTool для Inno, там это делается так же просто, где сразу можно прикрутить необходимые флаги, задачи и т.п., как для одной строки, так и для всех сразу.

Serega
08-04-2009, 20:51
boss911, но это же ISTool, который нужно устанавливать, а здесь всего 500 кило и установка не нужна. Конвертирование из reg-файлов, это только начало, планирую немного расширить её функциональность в будущем.

katok888
08-04-2009, 21:01
boss911, ISTool иногда коверкает рег файлы

katok888
08-04-2009, 21:18
Serega_, ошибка при открытии файла:
Access violation at address 00460202 in module 'Converter.exe'. Read of address FFFFFFFF.

Serega
08-04-2009, 21:26
katok888, а размер файла какой? Обычно, это происходит при открытии большого файла, я для этого и поставил ограничение...

P.S.
Покажите сам reg-файл.

katok888
08-04-2009, 21:58
Serega_,
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.mp3]
"PerceivedType"="audio"
"Content Type"="audio/mpeg"
@="AIMP.MP3"
"MP2.Last"="Custom"

[HKEY_CLASSES_ROOT\.mp3\OpenWithList]

[HKEY_CLASSES_ROOT\.mp3\OpenWithList\wmplayer.exe]

[HKEY_CLASSES_ROOT\.mp3\OpenWithProgIds]
"mp3file"=hex(0):

[HKEY_CLASSES_ROOT\.mp3\PersistentHandler]
@="{098f2470-bae0-11cd-b579-08002b30bfeb}"

Serega
08-04-2009, 22:19
katok888, исправил и перезалил, попробуйте.

boss911
08-04-2009, 23:08
но это же ISTool, который нужно устанавливать »
Какой там устанавливать, оно работает как portable, тем более распаковать из оф. установщика труда не заставит, всего 1,7 Mb. Не убедил меня, если что. :)

ISTool иногда коверкает рег файлы »
Три года как уже пользуюсь Inno Setup, перепаковал у себя уже все, что можно было перепаковать, то, где это имеет смысл, ни разу не столкнулся с вышеописанной проблемой.

volk1234
09-04-2009, 03:01
Serega_
добавил в шапку. Правьте пост #581 при появлении новых версий и доработке описания...

Serega
09-04-2009, 11:01
Converter v.0.1.1 - исправил обнаруженные ошибки. Ссылка в шапке темы.

-Marshall-
10-04-2009, 22:45
Скажите пожалуйста, а возможно ли реализовать такое, как у NSIS только в Inno Setup вот так:
http://pic.ipicture.ru/uploads/090410/34049/thumbs/Rh7V7bZ6cz.jpg (http://ipicture.ru/Gallery/Viewfull/17138812.html)

Если да, то пожалуйста напишите как...

Я имею ввиду выбор компонентов :)

Serega
10-04-2009, 23:50
-Marshall-, для отображения компонентов в виде дерева, вам понадобится установленные QuickStart Pack и InnoCompiler от Restools. Все ссылки есть в шапке. Вот пример скрипта:[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes
ComponentsListTVStyle=true

[Types]
Name: full; Description: Полная установка
Name: custom; Description: Выборочная установка; Flags: iscustom

[Components]
Name: a; Description: Моя программа™; Types: full custom
Name: a\a; Description: Руководство пользователя; Types: full
Name: a\a\a; Description: Русский; Flags: exclusive
Name: a\a\b; Description: English; Flags: exclusive
Name: a\b; Description: Справка; Types: full

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Components: a
Source: compiler:Examples\Readme-ru.txt; DestDir: {app}; Components: a\a\a
Source: compiler:Examples\Readme-en.txt; DestDir: {app}; Components: a\a\b
Source: compiler:Examples\MyProg.chm; DestDir: {app}; Components: a\b

-Marshall-
11-04-2009, 14:38
Спасибо, с этим я разобрался :)
Можете еще помочь вот в чем: я делаю трансформ-пак в основном под себя, но! я не знаю как зарезервировать файлы... Пробовал "Полноценное резервирование файлов с копированием в отдельную папку", но он почему-то не хочет копировать...
Вот мой SHFileOperation.iss на примере shell32.dll:


function BackupDir(const fromDir, toDir: string; IsMove: Boolean): Boolean;
var
fos: TSHFileOpStruct;
_fromDir, _toDir: string;
SR: TFindRec;
res: Boolean;
begin
ForceDirectories(toDir);
if IsMove then
fos.wFunc := FO_MOVE else
fos.wFunc := FO_COPY;
fos.fFlags := FOF_FILESONLY or FOF_SILENT or
FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
_fromDir:= AddBackslash(fromDir);
_toDir := AddBackslash(toDir);
if (Length(fromDir) = Length(_fromDir)) then
begin
res:= FindFirst(_fromDir + '*', SR);
try
while res do
begin
if (SR.Name <> '') and (SR.Name <> '.') and (SR.Name <> '..') then
begin
if SR.Attributes = FILE_ATTRIBUTE_DIRECTORY then
begin
_fromDir:= _fromDir + SR.Name + #0#0;
_toDir := _toDir + #0#0;
fos.pFrom := PChar(_fromDir);
fos.pTo := PChar(_toDir);
end else
begin
_fromDir:= _fromDir + SR.Name + #0#0;
_toDir := _toDir + SR.Name + #0#0;
fos.pFrom := PChar(_fromDir);
fos.pTo := PChar(_toDir);
end;
Result := (0 = ShFileOperation(fos));
_fromDir:= ExtractFilePath(_fromDir);
_toDir:= ExtractFilePath(_toDir);
end;
res := FindNext(SR);
end;
finally
FindClose(SR);
end;
end else
begin
_fromDir:= RemoveBackslashUnlessRoot(_fromDir) + #0#0;
_toDir := RemoveBackslashUnlessRoot(_toDir) + #0#0;
fos.pFrom := PChar(_fromDir);
fos.pTo := PChar(_toDir);
Result := (0 = ShFileOperation(fos));
end;
end;

{****************************************************************}
function MoveDir(const fromDir, toDir: string): Boolean;
begin
Result := BackupDir(fromDir, toDir, True);
end;

{****************************************************************}
function CopyDir(const fromDir, toDir: string): Boolean;
begin
CopyDir('{sys}\shell32.dll', '{win}\Windows Se7en Theme\Backup');
Result := BackupDir(fromDir, toDir, False);
end;

{****************************************************************}
function DelDir(dir: string; toRecycle: Boolean): Boolean;
var
fos: TSHFileOpStruct;
_dir: string;
begin
_dir:= RemoveBackslashUnlessRoot(dir) + #0#0;
fos.wFunc := FO_DELETE;
fos.fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
if toRecycle then
fos.fFlags := fos.fFlags or FOF_ALLOWUNDO;
fos.pFrom := PChar(_dir);
Result := (0 = ShFileOperation(fos));
end;

{****************************************************************}
function RenameDir(const fromDir, toDir: string): Boolean;
var
fos: TSHFileOpStruct;
_fromDir, _toDir: string;
begin
_fromDir:= RemoveBackslashUnlessRoot(fromDir) + #0#0;
_toDir := RemoveBackslashUnlessRoot(toDir) + #0#0;
fos.wFunc := FO_RENAME;
fos.fFlags := FOF_FILESONLY or FOF_ALLOWUNDO or
FOF_SILENT or FOF_NOCONFIRMATION;
fos.pFrom := PChar(_fromDir);
fos.pTo := PChar(_toDir);
Result := (0 = ShFileOperation(fos));
end;


:help: Пробовал через константы "Windows"a...не помогло, пробовал ставить в строчке "Result := BackupDir(fromDir, toDir, False);" True вместо False. Что не так?
И если есть другие способы, то пожалуйста, скажите.......

Serega
11-04-2009, 16:40
-Marshall-, вот пример SHFileOperation.iss, который у меня в архиве. ;***************************************************************;
;****************** SHFileOperation.iss ************************;
;***************************************************************;
;* Include this file in project. Example:
;* #include "SHFileOperation.iss"
;***************************************************************;
;************************ 1 ************************************;
;* function CopyDir(const fromDir, toDir: string): Boolean;
;* Example 1 (without <fromDir> trailing backslash):
;* CopyDir('C:\TMP\MyApp', 'C:\TMP\Backup');
;* Result: C:\TMP\Backup\MyApp\..all <MyApp> subdirs and files
;* Example 2 (with <fromDir> trailing backslash):
;* CopyDir('C:\TMP\MyApp\', 'C:\TMP\Backup');
;* Result: C:\TMP\Backup\..all <MyApp> subdirs and files
;***************************************************************;
;************************ 2 ************************************;
;* function MoveDir(const fromDir, toDir: string): Boolean;
;* Example 1 (without <fromDir> trailing backslash):
;* MoveDir('C:\TMP\MyApp', 'C:\TMP\Backup');
;* Result: C:\TMP\Backup\MyApp\..all <MyApp> subdirs and files
;* Example 2 (with <fromDir> trailing backslash):
;* MoveDir('C:\TMP\MyApp\', 'C:\TMP\Backup');
;* Result: C:\TMP\Backup\..all <MyApp> subdirs and files
;***************************************************************;
;************************ 3 ************************************;
;* function DelDir(dir: string; toRecycle: Boolean): Boolean;
;* If <toRecycle> is True, <dir> deleted in Recycle Bin.
;***************************************************************;
;************************ 4 ************************************;
;* function RenameDir(const fromDir, toDir: string): Boolean;
;***************************************************************;
;***************************************************************;
;***************************************************************;

[_Code]
type
TSHFileOpStruct = record
Wnd: HWND;
wFunc: UINT;
pFrom: PChar;
pTo: PChar;
fFlags: Word; // FILEOP_FLAGS;
fAnyOperationsAborted: BOOL;
hNameMappings: HWND; // Pointer;
lpszProgressTitle: PChar; { only used if FOF_SIMPLEPROGRESS }
end;

const
// use in wFunc
{ $EXTERNALSYM FO_MOVE }
FO_MOVE = $0001;
{ $EXTERNALSYM FO_COPY }
FO_COPY = $0002;
{ $EXTERNALSYM FO_DELETE }
FO_DELETE = $0003;
{ $EXTERNALSYM FO_RENAME }
FO_RENAME = $0004;
// use in fFlags
{ $EXTERNALSYM FOF_MULTIDESTFILES }
FOF_MULTIDESTFILES = $0001;
{ $EXTERNALSYM FOF_CONFIRMMOUSE }
FOF_CONFIRMMOUSE = $0002;
{ $EXTERNALSYM FOF_SILENT }
FOF_SILENT = $0004; { don't create progress/report }
{ $EXTERNALSYM FOF_RENAMEONCOLLISION }
FOF_RENAMEONCOLLISION = $0008;
{ $EXTERNALSYM FOF_NOCONFIRMATION }
FOF_NOCONFIRMATION = $0010; { Don't prompt the user. }
{ $EXTERNALSYM FOF_WANTMAPPINGHANDLE }
FOF_WANTMAPPINGHANDLE = $0020; { Fill in
SHFILEOPSTRUCT.hNameMappings
Must be freed using
SHFreeNameMappings }
{ $EXTERNALSYM FOF_ALLOWUNDO }
FOF_ALLOWUNDO = $0040;
{ $EXTERNALSYM FOF_FILESONLY }
FOF_FILESONLY = $0080; { on *.*, do only files }
{ $EXTERNALSYM FOF_SIMPLEPROGRESS }
FOF_SIMPLEPROGRESS = $0100; { means don't show names of files }
{ $EXTERNALSYM FOF_NOCONFIRMMKDIR }
FOF_NOCONFIRMMKDIR = $0200; { don't confirm making any
needed dirs }
{ $EXTERNALSYM FOF_NOERRORUI }
FOF_NOERRORUI = $0400; { don't put up error UI }


function SHFileOperation(const lpFileOp: TSHFileOpStruct):Integer;
external 'SHFileOperation@shell32.dll stdcall';

{****************************************************************}
{****************************************************************}
{****************************************************************}

function BackupDir(const fromDir, toDir: string; IsMove: Boolean): Boolean;
var
fos: TSHFileOpStruct;
_fromDir, _toDir: string;
SR: TFindRec;
res: Boolean;
begin
ForceDirectories(toDir);
if IsMove then
fos.wFunc := FO_MOVE else
fos.wFunc := FO_COPY;
fos.fFlags := FOF_FILESONLY or FOF_SILENT or
FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
_fromDir:= AddBackslash(fromDir);
_toDir := AddBackslash(toDir);
if (Length(fromDir) = Length(_fromDir)) then
begin
res:= FindFirst(_fromDir + '*', SR);
try
while res do
begin
if (SR.Name <> '') and (SR.Name <> '.') and (SR.Name <> '..') then
begin
if SR.Attributes = FILE_ATTRIBUTE_DIRECTORY then
begin
_fromDir:= _fromDir + SR.Name + #0#0;
_toDir := _toDir + #0#0;
fos.pFrom := PChar(_fromDir);
fos.pTo := PChar(_toDir);
end else
begin
_fromDir:= _fromDir + SR.Name + #0#0;
_toDir := _toDir + SR.Name + #0#0;
fos.pFrom := PChar(_fromDir);
fos.pTo := PChar(_toDir);
end;
Result := (0 = ShFileOperation(fos));
_fromDir:= ExtractFilePath(_fromDir);
_toDir:= ExtractFilePath(_toDir);
end;
res := FindNext(SR);
end;
finally
FindClose(SR);
end;
end else
begin
_fromDir:= RemoveBackslashUnlessRoot(_fromDir) + #0#0;
_toDir := RemoveBackslashUnlessRoot(_toDir) + #0#0;
fos.pFrom := PChar(_fromDir);
fos.pTo := PChar(_toDir);
Result := (0 = ShFileOperation(fos));
end;
end;

{****************************************************************}
function MoveDir(const fromDir, toDir: string): Boolean;
begin
Result := BackupDir(fromDir, toDir, True);
end;

{****************************************************************}
function CopyDir(const fromDir, toDir: string): Boolean;
begin
Result := BackupDir(fromDir, toDir, False);
end;

{****************************************************************}
function DelDir(dir: string; toRecycle: Boolean): Boolean;
var
fos: TSHFileOpStruct;
_dir: string;
begin
_dir:= RemoveBackslashUnlessRoot(dir) + #0#0;
fos.wFunc := FO_DELETE;
fos.fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
if toRecycle then
fos.fFlags := fos.fFlags or FOF_ALLOWUNDO;
fos.pFrom := PChar(_dir);
Result := (0 = ShFileOperation(fos));
end;

{****************************************************************}
function RenameDir(const fromDir, toDir: string): Boolean;
var
fos: TSHFileOpStruct;
_fromDir, _toDir: string;
begin
_fromDir:= RemoveBackslashUnlessRoot(fromDir) + #0#0;
_toDir := RemoveBackslashUnlessRoot(toDir) + #0#0;
fos.wFunc := FO_RENAME;
fos.fFlags := FOF_FILESONLY or FOF_ALLOWUNDO or
FOF_SILENT or FOF_NOCONFIRMATION;
fos.pFrom := PChar(_fromDir);
fos.pTo := PChar(_toDir);
Result := (0 = ShFileOperation(fos));
end;

{****************************************************************}
function FilesMaskOperation(const fromDir, toDir, fileMask: string; FileOp: Integer; EmptyDirRemove: Boolean; toRecycle: Boolean): Boolean;
var
fos: TSHFileOpStruct;
_fromDir, _toDir: string;
FSR, DSR: TFindRec;
FindResult: Boolean;
APath: string;
begin
APath := AddBackslash(fromDir);
FindResult := FindFirst(APath + fileMask, FSR);
try
while FindResult do
begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
begin
Case FileOp of
FO_COPY:
begin
fos.wFunc := FO_COPY;
end;
FO_MOVE:
begin
fos.wFunc := FO_MOVE;
end;
FO_DELETE:
begin
fos.wFunc := FO_DELETE;
if toRecycle then fos.fFlags := fos.fFlags or FOF_ALLOWUNDO;
end;
FO_RENAME:
begin
fos.wFunc := FO_RENAME;
end;
else
;
end;
fos.fFlags := fos.fFlags or FOF_FILESONLY or FOF_SILENT or
FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
_fromDir:= APath + FSR.Name + #0#0;
_toDir:= AddBackslash(toDir) + FSR.Name + #0#0;
ForceDirectories(ExtractFilePath(_toDir));
fos.pFrom := PChar(_fromDir);
fos.pTo := PChar(_toDir);
Result := (0 = ShFileOperation(fos));
end;
FindResult := FindNext(FSR);
end;
FindResult := FindFirst(APath + '*.*', DSR);
while FindResult do
begin
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and
not ((DSR.Name = '.') or (DSR.Name = '..')) then
{Recursion} FilesMaskOperation(APath + DSR.Name, AddBackslash(toDir) + DSR.Name, fileMask, FileOp, EmptyDirRemove, toRecycle);
FindResult := FindNext(DSR);
end;
finally
FindClose(FSR);
FindClose(DSR);
if EmptyDirRemove then RemoveDir(APath);
end;
end;

function CopyFiles(const fromDir, toDir, fileMask: string): Boolean;
begin
Result := FilesMaskOperation(fromDir, toDir, fileMask,
FO_COPY, False, False);
end;

function MoveFiles(const fromDir, toDir, fileMask: string): Boolean;
begin
Result := FilesMaskOperation(fromDir, toDir, fileMask,
FO_MOVE, True, False);
end;

function DelFiles(const fromDir, fileMask: string; toRecycle: Boolean ): Boolean;
begin
Result := FilesMaskOperation(fromDir, '', fileMask,
FO_DELETE, True, toRecycle);
end;
{****************************************************************}
{****************************************************************}


;Как исправить небольшую ошибку в работе востановления файлов и папок при удалении, т.е. есть скрипт для этого но он
;не корректо работает с востановлением папок а именно получаеться так что деинсталлятор не может перезаписать папку, а просто
;создает в ней же свою копию (должно быть так имя_папки1\, а получаеться так имя_папки1\имя_папки1\), а вот с обычными
;файлами без папок все хорошо.

#include "SHFileOperation.iss"

[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UpdateUninstallLogAppName=False

[Tasks]
Name: src; Description: Создать резервную копию файлов?

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; BeforeInstall: CreateBackup; Flags: ignoreversion

[_Code]
function MoveFile(const srcFile, destFile: PChar): Integer; external 'MoveFileA@kernel32.dll stdcall';

procedure CreateBackup;
var
srcFile, destFile: string;
basePath, shortPath: string;
begin
if IsTaskSelected('src') then
begin
basePath := ExpandConstant('{app}');
srcFile := ExpandConstant(CurrentFileName);
shortPath := srcFile;
StringChangeEx(shortPath, basePath, '', True);
destFile := ExpandConstant('{app}\Backup') + shortPath;
ForceDirectories(ExtractFilePath(destFile));
MoveFile(PChar(srcFile), PChar(destFile));
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
begin
MoveDir(ExpandConstant('{app}\Backup\'), ExpandConstant('{app}'));
RemoveDir(ExpandConstant('{app}\Backup\'));
end;
end;

-Marshall-
11-04-2009, 18:50
[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; BeforeInstall: CreateBackup;
Я так понял он резервирует MyProg.exe? Или что? :search:
Если я неправильно изъяснился, то я поправлю себя: как сделать, чтоб Inno Setup скопировал нужные файлы в нужную директорию, независимо, где располагаются эти файлы. Например мне нужно, чтоб перед выполнением сценариев секции [Run], инсталлятор скопировал файл shell32.dll из {sys} в {app}\Backup

Serega
11-04-2009, 21:52
инсталлятор скопировал файл shell32.dll из {sys} в {app}\Backup »

Source: {sys}\shell32.dll; DestDir: {app}\Backup; Flags: external skipifsourcedoesntexist

-Marshall-
11-04-2009, 22:02
ааааа, по-ходу то, спс :)

МИШАНЧИК
12-04-2009, 06:39
Подскажите пожалуйста!
Имеется ли возможность как-то сделать(в скрипте прописать) чтобы при деинсталяции скомпилированной мной программы деинсталятор сначала закрывал .exe процесс деинсталируемой программы?

Serega
12-04-2009, 08:33
МИШАНЧИК, вот ссылка на пост, там как раз приведён пример и прикреплена необходимая .dll’ка.




© OSzone.net 2001-2012