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

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

Автор: Victor_Dobrov
Дата сообщения: 22.03.2008 01:33
Trancsend, В Inno Setup 5-х версий мастер установки и деинсталлятор - это один файл. (Setup.e32)
Автор: Trancsend
Дата сообщения: 22.03.2008 11:29
Victor_Dobrov
Спасибо. А что же тогда делать? Nsis?
Автор: DarkSeroy
Дата сообщения: 22.03.2008 12:17
Люди, а кто-нибудь знает эсть ли скрипт, что б с помощью него, после компиляции записуишь диск и иго нельзя было скопировать.
Автор: Cryzer
Дата сообщения: 22.03.2008 14:20
Здравствуйте!
1) Если среди компонентов, выбираемых при установке, присутсвуют компоненты для Windows XP\Vista, исключительно для XP и исключительно для Vista, то как мне сделать, чтобы при запуске инсталлятора автоматически определялась версия ОС и те компоненты, которые не должны быть выбраны для неё (т.е. те, которые к ней не относятся), отключались и становились заблокированными?
2) Можно ли в InnoSetup сделать компоненты сворачиваемыми? Т.е. чтобы был значок "+", как в NSIS?
3) Существует плагин ISTask.dll, который с помощью [more=кода][Files]
Source: C:\Program Files\ISTask\ISTask.dll; DestDir: {tmp}; Flags: dontcopy

[ Code]
function KillTask(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload';

function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload';

//**************************************************//
function InitializeSetup(): Boolean;
begin
If RunTask('XXX.exe', false) then
begin
if MsgBox('Программа XXX запущена, завершить её работу?', mbInformation, mb_YesNo) = idYes then
begin
KillTask('XXX.exe');
Result:= True;
end else
Exit;
end;
Result:=True;
end;[/more] после запуска инсталлятора определяет запущенный процесс и выгружает его. Но как мне сделать, чтобы после запуска деинсталлятора определялся запущенный процесс и тоже выгружался?
Помогите, кто чем может!
Автор: elapse
Дата сообщения: 22.03.2008 17:23
Cryzer,
2) Нет, к сожалению, нельзя.
3) Уже спрашивали и не раз. Подробнее.
Автор: Dimbay
Дата сообщения: 23.03.2008 09:57
Kindly
Genri
Делаю инсталлятор для мода на Рим.Всё хорошо,но так и не справился с поставленной собою задачей(сделать всё это в одном скрипте).Для того чтобы запускался звук мода,необходимо сначала с помощью батника распаковать оригинальный звук Рима, и только затем закинуть с заменой свои папки(звук мода),ну и потом с помощью другово батника всё это запаковать!Дело в том,что всё это получается только если делать два скрипта,ну и соответственно получается две инсталяхи.
С праздничком! (у нас в Казахстане вчера Новый Год наступил... (Наурыз) )


Добавлено:
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
--------------------------------------------------------------------------------
[[more=то,что не работает...]Setup]
AppName=Mod
AppVerName=Mod
AppPublisher=Mod Team
DefaultDirName={reg:HKLM\SOFTWARE\The Creative Assembly\Rome - Total War,InstallPath|{pf}\Rome-TotalWar}
DisableDirPage=no
DefaultGroupName=Mod
OutputDir=D:\Mod
OutputBaseFilename=Mod_Setup
Compression=lzma/ultra
SolidCompression=yes
[more=то,что не работает...][/more]
[Languages]
Name: english; MessagesFile: compiler:Default.isl
Name: russian; MessagesFile: compiler:Languages\Russian.isl

[Files]
Source: D:\Mod\data_m\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs overwritereadonly
Source: unpackmusic.bat; DestDir: {app}; AfterInstall: Unpack(); Flags: ignoreversion
Source: D:\Mod\data_unpack\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
Source: Patch_for_Music_Mod.bat; DestDir: {app}; AfterInstall: Pack(); Flags: ignoreversion
Source: D:\Mod\data_patch\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
Source: setup.ico; DestDir: {app}

[Icons]
Name: {group}\{cm:UninstallProgram,Mod}; Filename: {uninstallexe}
Name: {commondesktop}\Mod; Filename: {app}\RomeTW-BI.EXE; WorkingDir: {app}; IconFilename: {app}\setup.ico; Parameters: " -nm"
Name: {group}\Mod; Filename: {app}\rometw-bi.exe; WorkingDir: {app}; IconFilename: {app}\setup.ico; IconIndex: 0; Parameters: " -nm"


[Code]
procedure Unpack();
var
ResultCode: Integer;
begin
Exec(ExpandConstant('{app}\unpackmusic.bat'), '', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
DeleteFile(ExpandConstant('{app}\unpackmusic.bat'));
end;

procedure Pack();
var
ResultCode: Integer;
begin
Exec(ExpandConstant('{app}\Patch_for_Music_Mod.bat'), '', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
DeleteFile(ExpandConstant('{app}\Patch_for_Music_Mod.bat'));
DelTree(ExpandConstant('{app}')+'\data\sounds\data', True, True, True);
end;[/more]

Добавлено:
Видите,даже тэги нормально закрыть не могу
Автор: Cryzer
Дата сообщения: 23.03.2008 12:25
elapse, спасибо! Но в третьем вопросе получается, что ISTask.dll извлекается в папку с программой, а потом деинсталлятор берёт его оттуда... А засунуть dll'шку в деинсталлятор невозможно?

Жду, когда кто-нибудь поможет ответить на [more=1)]1) Если среди компонентов, выбираемых при установке, присутсвуют компоненты для Windows XP\Vista, исключительно для XP и исключительно для Vista, то как мне сделать, чтобы при запуске инсталлятора автоматически определялась версия ОС и те компоненты, которые не должны быть выбраны для неё (т.е. те, которые к ней не относятся), отключались и становились заблокированными?[/more] вопрос! (см. через 2 поста выше)
Автор: ErshovSP2004
Дата сообщения: 23.03.2008 13:40
Господа, помогите. По окончании установки необходимо создать ярлык. Причем разместить его на рабочем столе для всех пользователей, т.е. например для русской XP это папка "c:\Documents and Settings\All Users\Рабочий стол\"
Автор: Kutsenko
Дата сообщения: 23.03.2008 14:34
2 ErshovSP2004
Помоему так:
Name: {commondesktop}\Need for Speed Most Wanted; Filename: {app}\speed.exe; Tasks: desktopicon
Автор: Vitalliano
Дата сообщения: 23.03.2008 14:41
Ребята! Подскажите кто знает, как можно в реестре записать к примеру
{app}\Game или {app}\Game\app в ValueType: binary; заранее благодарю!!!
Автор: ErshovSP2004
Дата сообщения: 23.03.2008 15:04
Kutsenko
Спасибо, конечно нужно использовать {commondesktop}, в очередной раз поленился сам попробовать. Я просто грешным делом подумал, прочитав описание, что {userdesktop} & {commondesktop} одно и тоже лишь ссылка на папку пользователя
Автор: serg_aka_lain
Дата сообщения: 23.03.2008 15:14
Vitalliano


Цитата:
в ValueType: binary;


procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
begin
RegWriteBinaryValue(HKLM, 'Software\My Program', 'InstallDir', ExpandConstant('{app}') + '\Game');
end;
end;
Автор: DarkSeroy
Дата сообщения: 23.03.2008 15:30
Люди, а кто-нибудь знает эсть ли скрипт, что б с помощью него, после компиляции записуишь диск и иго нельзя было скопировать.
Автор: Forslay
Дата сообщения: 23.03.2008 16:25

Цитата:
Люди, а кто-нибудь знает эсть ли скрипт, что б с помощью него, после компиляции записуишь диск и иго нельзя было скопировать.
Ты что с ума сошёл? Конечно же нет... Такая проблема рещаеся иным способом... например CD-RX диски офигительная вещь... юзай.... http://cd-rx.ru/
Автор: Vitalliano
Дата сообщения: 24.03.2008 00:49
serg_aka_lain

Огромная блягодарность!
Автор: ErshovSP2004
Дата сообщения: 24.03.2008 07:57
У кого нибудь есть наработки реализующие отображение лога консольного приложения запущенного из секции [RUN]. Например: Есть заготовка инсталяции (назовем её Setup.exe), которая предназначена для обновления справочников. Сами справочники валяются заархивированные под ногами у Setup.exe. Необходимо лог разархивирования, а так же лог обновления выводить ну например в TMemo на страничке с прогресбаром.
Автор: Nrs
Дата сообщения: 24.03.2008 11:00
подскажите плиз. при установке нужно добавить в виндовую переменную окружения Path еще один путь. но я что-то не придумал ничего умного как удалять старое значение и прописывать новое. в моем случае это вполне проходит, но хотелось бы сделать по-правильному. буду очень благодарен любой подсказке
Автор: Genri
Дата сообщения: 24.03.2008 12:56
ErshovSP2004

Цитата:
отображение лога консольного приложения
-- насколько помню, в ISTask.dll есть функция, возвращающая результат работы консольного приложения:

function ExecConsoleAppX(CommandLine: PChar): PChar;
external 'ExecConsoleAppX@files:ISTask.dll stdcall';

Nrs -- http://www.jrsoftware.org/isfaq.php#env
Читаешь текущее значение Path (как угодно: из реестра, функцией GetEnv, используя консольную SET и т.п.); добавляешь нужный путь; сохраняешь. Какой из этих этапов у тебя вызывает проблемы ? Я так понял, что ты умеешь сохранять и удалять. Не получается прочитать или сложить две строки ?
Автор: GRom V
Дата сообщения: 24.03.2008 14:33
Подскажите - кто знает:
Дано: Win 64 и Win 32
и две ветки реестра:

[Registry]
Root: HKCR; SubKey: Installer\Products\Win 64
Root: HKCR; SubKey: Installer\Products\Win 32

Как можно (если можно) сделать установку по выбору с помощью
1) секции [Tasks]
2) секции [Components]
/////////////////////////////////////////////////////////////////////////////////////
С помощью [Components] здесь понятно.....только не могу избавится от вкладок:
полная установка...ит.д. еслиб можно было както убрать вкладки.
Вообщем выскажите свои мнения кто как думает...
Спасибо...
Автор: Nrs
Дата сообщения: 24.03.2008 15:25
Genri
спасибо, проблемы были в том что я далек от программирования решение нашел в Knowledge Base.
Автор: geranik
Дата сообщения: 24.03.2008 15:53
GRom V
В смысле в Types оставить 1 строчку с iscustom, если я правильно понял про вкладки.
[Types]
Name: "выборочная!"; Description: "Выбрано в ручную"; Flags: iscustom
Автор: Dimbay
Дата сообщения: 24.03.2008 17:46
Genri
Приветствую!
Я всё по тому же вопросу(56 страница),не подскажите?Парюсь-парюсь,никак в одном скрипте не получается...
Автор: Diawer
Дата сообщения: 24.03.2008 18:11
elapse, спасибо помог, но появился ещё вопрос по этому уже [more=Коду]
[Setup]
AppName=My Program
AppVerName=My Program [Version]
DefaultDirName={pf}\My Program
InfoBeforeFile=readme1.txt

[Files]
Source: readme2.txt; DestDir: {tmp}; Flags: dontcopy;

[Code]
procedure InitializeWizard();
var
String: String;
begin
ExtractTemporaryFile('readme2.txt');
LoadStringFromFile(ExpandConstant('{tmp}\readme2.txt'), String);
CreateOutputMsgMemoPage(wpInfoBefore, 'New InfoBeforePage', 'Some interesting information', WizardForm.InfoBeforeClickLabel.Caption, String);
end;
[/more], как сделать, что бы дополнительное окно "Информация" появлялось только при
выборе русского языка

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

Автор: elapse
Дата сообщения: 24.03.2008 20:03
Diawer, то есть страница wpInfoBefore? [more=Подробнее][no]
[Setup]
AppName=My Program
AppVerName=My Program [Version]
DefaultDirName={pf}\My Program
InfoBeforeFile=readme1.txt

[Files]
Source: readme2.txt; DestDir: {tmp}; Flags: dontcopy;

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

[Code]
procedure InitializeWizard();
var
String: String;
begin
ExtractTemporaryFile('readme2.txt');
LoadStringFromFile(ExpandConstant('{tmp}\readme2.txt'), String);
CreateOutputMsgMemoPage(wpInfoBefore, 'New InfoBeforePage', 'Some interesting information', WizardForm.InfoBeforeClickLabel.Caption, String);
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID = wpInfoBefore) and (ExpandConstant('{language}') <> 'russian') then Result := True;
end;
[/no][/more].
Или та страница, которую мы создаём в InitializeWizard? [more=Подробнее][no]
[Setup]
AppName=My Program
AppVerName=My Program [Version]
DefaultDirName={pf}\My Program
InfoBeforeFile=readme1.txt

[Files]
Source: readme2.txt; DestDir: {tmp}; Flags: dontcopy;

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

[Code]
procedure InitializeWizard();
var
String: String;
begin
if ExpandConstant('{language}') = 'russian' then
begin
ExtractTemporaryFile('readme2.txt');
LoadStringFromFile(ExpandConstant('{tmp}\readme2.txt'), String);
CreateOutputMsgMemoPage(wpInfoBefore, 'New InfoBeforePage', 'Some interesting information', WizardForm.InfoBeforeClickLabel.Caption, String);
end;
end;
[/no][/more]
Автор: Genri
Дата сообщения: 24.03.2008 20:47
Dimbay

Цитата:
необходимо сначала с помощью батника распаковать оригинальный звук Рима, и только затем закинуть с заменой свои папки(звук мода),ну и потом с помощью другово батника всё это запаковать
-- я не слишком знаком с "модой Рима" и не совсем понял - в чем проблема ? Не получается совместить два скрипта, которые по отдельности все делают правильно ?

Цитата:
Source: D:\Mod\data_m\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs overwritereadonly
Source: unpackmusic.bat; DestDir: {app}; AfterInstall: Unpack(); Flags: ignoreversion
Source: D:\Mod\data_unpack\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
Source: Patch_for_Music_Mod.bat; DestDir: {app}; AfterInstall: Pack(); Flags: ignoreversion
Source: D:\Mod\data_patch\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
-- это уже попытка совместить или только один из скриптов ?
Выложи оба работающих отдельно. Проблем быть не должно (разве что кроме AfterInstall можно использовать еще и BeforeInstall)
Автор: Dimbay
Дата сообщения: 24.03.2008 21:07
Genri
Уже попытка совместить...
Я завтра ещё попробую...
Просто тяжело в 32 года программирование осваивать(вроде и слова все понятные "Ярослав","Богуслав"),как в Собачьем Сердце,так и здесь вроде всё понятно,что нужно сделать,а знаний маловато...
Автор: Diawer
Дата сообщения: 24.03.2008 22:31
Понравился [more=Код][Files]
Source: ISTask.dll; DestDir: {app}

[Код]
function KillTaskA(ExeFileName: string): Integer;
external 'KillTask@{app}\ISTask.dll stdcall delayload uninstallonly';

function RunTaskA(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@{app}\ISTask.dll stdcall delayload uninstallonly';

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

function InitializeUninstall(): Boolean;
begin
If RunTaskA('DeskStickers.exe', false) then
KillTaskA('DeskStickers.exe');
Result := True;
Exit;
end;[/more], но есть вопросы.
Поскольку инсталлятор у меня многоязыковый я сделал, что бы закрытие запущенного
процесса происходило без вопроса, вопрос такой как сделать, что бы код выполнялся
после стандартного сообщения "Вы действительно хотите удалить XXX и все его компоненты?",
то есть если я запускаю деинсталлятор то приложение сначала выгружается и потом запускаеться
сам деинсталлятор, а надо что бы код запускался после выше указанного вопроса.

И подскажите пожалуйста, как сделать, что бы была возможность изменить надпись в том же
[more=Коде][Files]
Source: ISTask.dll; DestDir: {app}

[Код]
function KillTaskA(ExeFileName: string): Integer;
external 'KillTask@{app}\ISTask.dll stdcall delayload uninstallonly';

function RunTaskA(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@{app}\ISTask.dll stdcall delayload uninstallonly';

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

function InitializeUninstall(): Boolean;
begin
If RunTaskA('DeskStickers.exe', false) then
begin
if MsgBox('Программа установки обнаружила, что программа запущена в данный момент. Закрыть программу?', mbInformation, mb_YesNo) = idYes then
begin
KillTaskA('DeskStickers.exe');
Result := True;
end else
Exit;
end;
Result := True;
end;[/more] в шапке окна, надпись "Деинсталляция", на "Удалить DeskStickers".

Добавлено:
elapse, большое спасибо, опять помог, всё работает.
Автор: The Unforgiven
Дата сообщения: 24.03.2008 23:01
Вышел Inno Script Generator с поддержкой 5.2.3, поправил шапку соответственно.
Автор: Genri
Дата сообщения: 24.03.2008 23:33
Diawer

Цитата:
я сделал, что бы закрытие запущенного
процесса происходило без вопроса, вопрос такой как сделать, что бы код выполнялся
после стандартного сообщения "Вы действительно хотите удалить XXX и все его компоненты?"
-- вместо function InitializeUninstall(): Boolean; можно использовать procedure InitializeUninstallProgressForm();

Код:
procedure InitializeUninstallProgressForm();
begin
If RunTaskA('DeskStickers.exe', false) then
KillTaskA('DeskStickers.exe');
end;
Автор: Victor_Dobrov
Дата сообщения: 25.03.2008 01:57
Загрузка Jpeg через OleLoadPicture:

Пытался прикрутить в Inno загрузку jpeg-файлов напрямую, и вот что накопал:
К Jpg(Gif, Png...)-файлу или ресурсу, загруженному через OleLoadPicture (COM) можно обращаться как к HBITMAP.
Кто подскажет, возможно ли грузить jpeg-файл вместо BMP без сторонних библиотек (таких как isxbb.dll). Например так: через OleLoadPicture (или Gdiplus::Image) грузим jpg-файл и накладываем результат в виде HBITMAP на фоновое окно...

Вот описания и примеры из MSDN (8 web-страниц, 273 Кб), а [more=вот код]
STDAPI OleLoadPicture(
IStream * pStream,
Pointer to the stream that contains picture's data
LONG lSize,
Number of bytes read from the stream
BOOL fRunmode,
The opposite of the initial value of the picture's property
REFIID riid,
Reference to the identifier of the interface describing the type of interface pointer to return
VOID ppvObj );
Address of output variable that receives interface pointer requested in riid

function LoadJPGGIFBMPMemory(Ptr: HGlobal; Size: DWORD) : HBitmap;
var Stream: IStream;
hh: THandle;
begin
Result := 0l;
if CreateStreamOnHGlobal(ptr, true, Stream) <> S_OK then exit;
if OleLoadPicture(Stream, Size, false, IID_IPicture, PICTURE) <> S_OK then exit;
PICTURE.get_Handle(hh);
Result := HBitmap(hh);
end;

function OleLoadPicture(IStream: Variant; lSize: Integer; fRunMode: Boolean; riid: Variant; var ppvObj: Variant): LongInt; external 'OleLoadPicture@oleaut32.dll stdcall';

var ImageStream: Variant;
ImageStream:= CreateOleObject('LPSTREAM');
function ShowWindow(hWnd, nCmdShow: LongWord): LongWord; external 'ShowWindow@user32.dll stdcall';
[/more] в сыром виде...

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Поиск в WinDjView


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