Написание скрипта для инсталлятора

  • Автор темы Kindly
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A

Alexey.

День добрый!

Может кто подскажет, как реализовать в Inno Setup:
Проект состоит из БД и клиента. При запуске пользователь на страничке выбора компонентов пользователь указывает, что ему ставить (только БД на сервер, только локального клиента, либо и то и другое).
В моей нынешней реализации при выборе только компонента "БД" происходит следующее:
1) появляется приветствие
2) выбор каталога (нужен в случае установки клиентской части и абсолютно не нужен для БД)
3) происходит выбор устанавливаемых компонентов

вопрос в следующем: можно ли поменять порядок появления страничек визарда, что бы к моменту запроса каталога уже точно знать - надо мне это или нет?
 
K

Kindly

Выкладываю ссылку на составленное мной руководство по программированию в Inno:
 
E

Expeditor

<!--QuoteBegin-Guest_Snake_*+31:01:2006, 22:31 -->
<span class="vbquote">(Guest_Snake_* @ 31:01:2006, 22:31 )</span><!--QuoteEBegin-->Вопрос не в тему. При запуске программы в папке установки появляются всякие сохранения, профили, логи и при деинсталляции требуется их удалить. Помогите мне со скриптом на Delphi. При запуске программы вылетает сообщение с вопросом, удалять или нет файлы. При нажатии Нет программа закрывается, а принажатии Да - происходит удаление папок и файлов. Как сдетать чтобы программа удаляла не конкретный файл "filename.txt", а удаляла бы все вложенные папки(пустые и с файлами) и файлы, независимо от их имени и расширения.[/quote]

Вот я написал программу которая, удаляет все папки и файлы кроме самой себя и unins000.dat,unins000.exe в той папке где она запущена. Для написания этой проги я использовал Delphi 7

Код:
unit Uninstaller;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,ShellApi, XPMan;

type
TForm1 = class(TForm)
 XPManifest1: TXPManifest;
 procedure FormCreate(Sender: TObject);
 procedure FormShow(Sender: TObject);
private
 { Private declarations }
public
 { Public declarations }
end;

var
Form1:TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
lpFileOp: TSHFileOpStruct;
DirList:TStringList;
FileList:TStringList;
sr: tSearchRec;
i,j:integer;
Path: string;
begin
MessageBeep(MB_ICONASTERISK);
with Application do
begin
DirList:= TStringList.Create;
FileList:= TStringList.Create;
if findFirst('*.*',faAnyFile,sr)=0 then
repeat
if (sr.Name <> '..') and (sr.Name <> '.') then
 begin
 if sr.attr=faDirectory then DirList.Add(sr.Name)
 else FileList.Add(sr.Name);
 end;
until findNext(sr) <> 0;
FindClose(sr);
If MessageBox('Нажмите «Да», если вы хотите удалить все файлы из папки игры (в том числе и сохранения игры), или нажмите «Нет», если хотите оставить файлы, которые не были установлены вместе с игрой.' + #13#10#13#10 + 'Вы хотите удалить все файлы из папки игры?', MB_ICONQUESTION or MB_YesNo) = IDYes then
 begin
 for i:=0 to FileList.Count-1 do
  begin
  if FileList.Strings[i]<>'IsUninstaller.exe' then
   if FileList.Strings[i]<>'unins000.dat' then
   if FileList.Strings[i]<>'unins000.exe' then
    DeleteFile(PChar(FileList.Strings[i]));
  end;
 for j:=0 to DirList.Count-1 do
  begin
  Path:=ExtractFilePath(paramstr(0));
  FillChar(lpFileOp,SizeOf(lpFileOp),0);
  lpFileOp.Wnd := Handle;
  lpFileOp.wFunc := FO_DELETE;
  lpFileOp.pFrom := PChar(Path+'\'+DirList.Strings[j]);
  lpFileOp.fFlags := FOF_NOCONFIRMATION;
  SHFileOperation(lpFileOp);
  end;
 end;
end;
DirList.Free;
FileList.Free;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
close;
end;

end.
 
E

Expeditor

Ой, ошибочка закралась.
В тексте программы которую я написал выше нужно так:
Код:
 If MessageBox('Нажмите «Да», если вы хотите удалить все файлы из папки игры (в том числе и сохранения игры), или нажмите «Нет», если хотите оставить файлы, которые не были установлены вместе с игрой.' + #13#10#13#10 + 'Вы хотите удалить все файлы из папки игры?', 'Подтвердите удаление файлов',MB_ICONQUESTION or MB_YesNo) = IDYes then
Извиняюсь.
 
M

Mesmerized

Expeditor

Ты бы не мог выслать мне уже готовую программу? А то у меня сейчас Delphi нет, а программа, которую ты сделал, очень бы мне пригодилась. Мой е-mail: mesmerized@bk.ru
 
G

Guest_Snake_*

:) Спасибо большое! Очень помог начинающему!
 
Z

ZaV

просьба подсказать как можно при установке запомнить данные находящиеся в определенной ветке реестра чтоб потом при анинстале вернуть их на место

пишу я у примеру вот такие данные
Код:
Root: HKLM; SubKey: SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\Protocol_Catalog9; ValueType: dword; ValueName: Next_Catalog_Entry_ID; ValueData: $000003F6

заранее спасибо.
 
E

Expeditor

Вспомнил я тут одну замечательную програмку, которую я написал специально для использования с инсталляторами, а именно бывает так что вы хотите упаковать допустим игру, но не средствами инсталлятора, а любым дригим архиватором, а уже потом этот архив запускать из инсталлятора, и всё бы хорошо, но вот беда когда вы анинсталлите игруху файлы которые распаковал архиватор не удаляются, и правильно не удаляются, инсталятор же их не устанавливал, а как тогда быть, да очень просто, нужно создать пустые файлы с теме же именами и расширениями, что и в оригинале, и эти пустые файлы упаковать инсталлятором, и вот тут-то и поможет моя прога, с помощью неё открывыете оригинальные файлы и указываете папку куда сохранить пустые файлы, жмёте старт и всё.
Эх. путано наверное написал, но если не понятно спрашивайте.
Кстати говоря подбным способом многие пиратские игры упакованы.
Кому нужна моя программа могу выслать на мыло всего 171кб.
 
K

kaliostro

Извените у меня появилась одна проблемка:
Как сделать так что бы при выборе какого либо компанента делалась просто какая-то запись в файле ini, который не состоит из блоков, строк и папраметров, а просто имеет формат обычного текстового файла и нужно чтобы в этот файл была вставлена строчка.
И как это сделать?
 
M

Mesmerized

Expeditor

Вышли мне, пожалуйста, эту замечательную программу - mesmerized@bk.ru :)
 
M

Mesmerized

Expeditor

Спасибо большое за отличные программы!!! :D :D :D
 
K

Kindly

Expeditor, я именно о такой программке и подумывал в последнее время, уже хотел постить что-то подобное. Вышли, пожалуйста, на gubei_vadim@list.ru
буду весьма признателен :)
 
N

NoOne

Здравствуйте. Подскажите, пожалуйста, как оформить в коде переименование файлов функцией RenameFile. Например, файл по адресу {sys}\drivers\file_1.sys необходимо переименовать в file_2.sys... и что писать при этом в Var?

Есть ли функция переименования ключа реестра в InnoSetup? типа... RegRenameKey или что-то в этои роде...в справке нет. :)

Вообще вот такая задача: в случае использования определённой версии Windows инсталятор переименовывает два файла и один ключ реестра (всё это после установки всех файлов и значений реестра программы). Помогите, please, бьюсь над этим целый месяц :) ... перечитал все справки и руководства. Заранее спасибо.
 
G

Guest

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

Код:
function GetTopWindow (hwnd : Integer) : Integer;
external 'GetTopWindow@user32.dll stdcall';

function GetWindowText (hwnd : Integer; lpString : PChar; cch : Integer) : Integer;
external 'GetWindowTextA@user32.dll stdcall';

function GetNextWindow (hwnd : Integer; wFlag : Integer) : Integer;
external 'GetNextWindow@user32.dll stdcall';

Function IsAppRunning(Cap: string): Boolean;
var t:array[0..32] of char;
h: HWND;
begin
h:=GetTopWindow(0);
while h<>0 do
begin
t[GetWindowText(h,t,32)]:=CHR(0);
if pos(Cap,t)<>0 then
begin
MessageBox(handle, pchar('Обнаружено запущенное приложение: '+ chr(13)+ chr(13)
+ chr(9)+ Cap + chr(13)
+ chr(13)+ 'для корректности процесса обновления его необходимо закрыть!'),
'Внимание!',MB_OK+MB_ICONINFORMATION );
result:=true;
Exit;
end;
h:=GetNextWindow(h,GW_HWNDNEXT);
end;
result:=false;
end;
 
G

GuEst

Кто-нибудь может помочь - проблема с Uninstall'ом.
В общем суть - делаю программный комплекс.
В него входит драйвер для одного девайса. Если во время установки была выбрана установка драйвера, то всё ок - нашёл как перегрузить компьютер.
А вот как узнать при Uninstall'ировании, что он был установлен? Пробовал через IsComponentSelected('KRNLDrv'), но функция не срабатывает и вылетает с ошибкой, так как не разрешена в Uninstall'ере. Что делать? Можно это как-то сделать средствами скрипта без проверки существования файла?

Код имеет вид:
[Setup]
RestartIfNeededByRun=yes

<...>

[Components]
Name: "KRNLDrv"; Description: "Kernel Driver"; Types: full; Flags: restart

<...>

[Files]
Source: "krnldrv.dll"; DestDir: "{app}"; Components: KRNLDrv; Flags: restartreplace uninsrestartdelete

Код:
function UninstallNeedRestart(): Boolean;
begin
 result:=false;
 if [color="red"][b]{тут надо как-то проверить, что KRNLDrv был установлен (см. примечание)}[/b][/color] then result:=true;
end;[/quote]
ПРИМЕЧАНИЕ: к этому моменту файл драйвера уже удалён и Uninstall'ер закончил работать.
 
J

Jugin

Доброго времени суток!
Может кто нибудь написать код который бы менял через заданный временной интервал фоновый рисунок (в идеале с прорстенькими эффектами)? :D
 
J

Jugin

Неужели никто НЕ может/хочет или нет времени? :blink:
Пожалуйста напишите такой код :angry: , вроде бы в нём не должно быть ничего сложного и для зающего/умеющего человека делов на 5 минут.
 
G

Guest_Snake_*

Может кто нибудь написать код который бы менял через заданный временной интервал фоновый рисунок (в идеале с прорстенькими эффектами)?

А не пробовал воспользоваться InstallShield'ом? Там такие штуки - дело обычное и будет гораздо проще, чем написать код для Inno Setup.
 
G

Guest

<!--QuoteBegin-Guest_Snake_*+4:04:2006, 01:43 -->
<span class="vbquote">(Guest_Snake_* @ 4:04:2006, 01:43 )</span><!--QuoteEBegin-->А не пробовал воспользоваться InstallShield'ом? Там такие штуки - дело обычное и будет гораздо проще, чем написать код для Inno Setup.
[snapback]32951" rel="nofollow" target="_blank[/snapback]​
[/quote]
Мне у Inno Setup степень сжатия больше нравится, по этому и хотелось бы реализовать такую штуку с его использованием.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!