Форум программистов CODEBY.NET Хостинг в Беларуси — Active Technologies

Разработка бизнес сайтов

Нужны клиенты? Тогда сюда быстрее...
X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )


> Написание скрипта для инсталлятора
Гость_Kindly_*
сообщение 17:03:2005, 16:05
Цитата Ответить 





Инопланетный гость






    


(Вопрос по Inno Setup 5) Я извиняюсь за вопрос немножко не в тему. Меня интереcует написание скрипта на Pascal следующего характера: Перед запуском инсталлятора нужна проверка реестра на определённый ключ, и если он существует - должен запускаться мастер инсталляции, а если ключ не существует, то должна вылетать мессага, что прога не найдена - жмите OK чтобы покинуть мастер (ну или другой текст). Вобщем вы программеры - для вас скриптик или только секцию кода написать не составит труда. Поможете такому как мне?
mailto:gubei_vadim@list.ru
Подняться вверх 
 
Сообщение #1
10 страниц V  < 1 2 3 4 > »   
Новая тема 
Ответов (30 - 59)
Гость_Kindly_*
сообщение 4:05:2005, 10:27
Цитата Ответить 





Инопланетный гость






    


Извиняюсь за офтопик, но не знаю куда и кому написать следующий вопрос:
Многие инсталляторы создают логи, в которых можно засечь инсталляцию всех файлов и значений реестра. Но возникает проблема, когда надо перепаковать программу, в которой не было этого лога, например, его использование было отключено. С помощью какой программы-шпиона можно вычислить все происходящие события в Windows, т.е. например: какие файлы и когда были переименованы, установленны, перемещены; какие значения в реестр добавляются и т.п.? Чтобы правильно собрать инсталлятор.
Подняться вверх 
 
Сообщение #31
zubr
Вставить ник
сообщение 4:05:2005, 15:24
Цитата Ответить 


Божественный
Иконка группы

Группа: Модеры
Сообщений: 937
Регистрация: 19:11:2003
Пользователь №: 133



Репутация:   16  


FileMon, RegMon, а также различные отладчики типа W32dsm
Подняться вверх 
 
Сообщение #32
Гость_Kindly_*
сообщение 14:05:2005, 08:02
Цитата Ответить 





Инопланетный гость






    


С отладчиками чет не очень, но File Mon рулит, сенкс.
Вопрос следующий: Написал я скрипт, в котором при инициализации проверяется присутствие определенного ключа, и, если он существует, то выводится сообщение о том, не желает ли пользователь удалить уже установленное приложение "Yes/No" (это если инсталлятор запускается второй раз). При этом напрямую прописывается путь к деинсталлятору, например:
{win}\proga\unins00.exe
И через функцию Exec выполняется деинсталлятор, если пользователь выберет "Yes".
Вопрос в том, имеет ли Inno Setup возможность запускать приложения или выполнять другие файлы исходя из значений реестра? Например, если путь деинсталлятора прописан в папку с программой; ведь при инициализации это (если возможно) уже нужно делать через реестр же?
Подняться вверх 
 
Сообщение #33
Гость_Kindly_*
сообщение 14:05:2005, 08:35
Цитата Ответить 





Инопланетный гость






    


Может начинаю надоедать - вопрос другой, т.е. повторюсь.
Возможно ли проигрывание музыки XM или MOD в инсталляторе через соответствующую .dll-ку XM_Music.dll ? Вот она:
]]>http://make3d.narod.ru/xm_music/index.htm]]>
Если ссылка не рабочая, то попробуйте скачать XM_Music.dll отсюда:
]]>http://user.kem.ru/pro/delphi_utl.php]]>
Если будет время и настроение, то посмотрите, пожалуйста, можно ли с этим что либо сделать?
Подняться вверх 
 
Сообщение #34
zubr
Вставить ник
сообщение 14:05:2005, 09:07
Цитата Ответить 


Божественный
Иконка группы

Группа: Модеры
Сообщений: 937
Регистрация: 19:11:2003
Пользователь №: 133



Репутация:   16  


Будет время, гляну ваши вопросы.
Подняться вверх 
 
Сообщение #35
zubr
Вставить ник
сообщение 15:05:2005, 17:06
Цитата Ответить 


Божественный
Иконка группы

Группа: Модеры
Сообщений: 937
Регистрация: 19:11:2003
Пользователь №: 133



Репутация:   16  


Цитата
Вопрос в том, имеет ли Inno Setup возможность запускать приложения или выполнять другие файлы исходя из значений реестра? Например, если путь деинсталлятора прописан в папку с программой; ведь при инициализации это (если возможно) уже нужно делать через реестр же?

function InitializeSetup(): Boolean;
begin
Result:=True;
If (not RegKeyExists(HKLM, 'SOFTWARE\Borland\Delphi\5.0')) and
 (not RegKeyExists(HKLM, 'SOFTWARE\Borland\Delphi\6.0')) and
 (not RegKeyExists(HKLM, 'SOFTWARE\Borland\Delphi\7.0')) then
begin
 MsgBox('Not found Delphi on our computer', mbError, mb_Ok);
 Result:=False;
end;
end;

Это пример, как проверить установлена ли в системе Delphi. В вашем случае, аналогично, надо проверить присуствие определенного ключа в реестре и если он есть, прочитать значение ключа, где указан путь к unins00.exe, затем получив путь к данному файлу, запустить его функцией InstShellExec, см. пример ниже.
Цитата
Возможно ли проигрывание музыки XM или MOD в инсталляторе через соответствующую .dll-ку XM_Music.dll ?

Средствами InnoSetup проигрывание музыки в формате XM или MOD сделать большой гимор, если вообще возможно, практически не пробовал. Можно сделать для этого программку, которую запускать в InnoSetup, а еще проще вот вариант, с помощью которого можно запустить звуковой файл менее экзотического формата (*.wav, mp3 и т. п.):
function InitializeSetup(): Boolean;
var
 res:Integer;
begin
Result:=True;
InstShellExec('D:\mus.mp3', '', '', SW_HIDE, res);
end;
Подняться вверх 
 
Сообщение #36
_dimka_
Вставить ник
сообщение 15:05:2005, 19:01
Цитата Ответить 


Новенький
Иконка группы

Группа: Новенький
Сообщений: 58
Регистрация: 2:05:2005
Из: Краснодар
Пользователь №: 1 682



Репутация:   0  


вообще не по теме вопрос
Подняться вверх 
 
Сообщение #37
zubr
Вставить ник
сообщение 15:05:2005, 19:13
Цитата Ответить 


Божественный
Иконка группы

Группа: Модеры
Сообщений: 937
Регистрация: 19:11:2003
Пользователь №: 133



Репутация:   16  


_dimka_
Вообще то тема называется Delphi и Pascal. В инсталляторе InnoSetup используются скрипты на языке Pascal, так что вполне в тему.
Подняться вверх 
 
Сообщение #38
Гость_Kindly_*
сообщение 17:05:2005, 14:43
Цитата Ответить 





Инопланетный гость






    


Zubr, спасибо большое. Вы как всегда на высотеsmile.gif!
Подняться вверх 
 
Сообщение #39
Гость_Kindly_*
сообщение 18:05:2005, 12:30
Цитата Ответить 





Инопланетный гость






    


Такой функции (InstShellExec) в пятой версии вроде как нет, но можно и так:

Цитата
function InitializeSetup(): Boolean;
var
res: Integer;
begin
Result:=True;
ShellExec('play', ExpandConstant('{sd}\music.mp3'), '', '', SW_HIDE, ewNoWait, res)
end;


Но вот в чем требуемая фишка: хотелось бы, чтобы файл предварительно загружался во временную папку и сразу запускался из нее именно при инициализации (как сделать это в начале инсталляционного процесса я примерно знаю), а затем закрывался (или закрывалась, если это программа) после завершения инсталляции. Это возможно? Если да, то как? Если нет, то затея не удалась, да и особо не нужна она в принципе.

Вот это мне действительно нужно: я так и не разобрался:

Цитата
function InitializeSetup(): Boolean;
var
ResultStr: String;
ResultCode: Integer;
  begin
Result:=True;
  RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Program_is1', 'UninstallString', ResultStr);
if ResultStr='???' \\ведь константа какая-то нужна? Или это лишнее?
then
  begin
if not ShellExec(???), '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode)
then
  MsgBox('Ошибка удаления.' #13#13 '' + SysErrorMessage(ResultCode) + '.', mbError, MB_OK);
end;
end;


Ну, вроде как функцию RegQueryStringValue надо использовать, так?
Ну, вроде считываем параметр деинсталлятора - 'UninstallString'.
Ну, вроде ResultStr - это и есть (значение) прямой путь к деинсталлятору (включая сам деинсталлятор *.exe).
А дальше не врубаюсь, помогите, пожалуйста...
Подняться вверх 
 
Сообщение #40
zubr
Вставить ник
сообщение 18:05:2005, 19:57
Цитата Ответить 


Божественный
Иконка группы

Группа: Модеры
Сообщений: 937
Регистрация: 19:11:2003
Пользователь №: 133



Репутация:   16  


Вот код решающий оба ваших вопроса:
function InitializeSetup(): Boolean;
var
 res:Integer;
 s, ResultStr:string;
begin
ExtractTemporaryFile(music.mp3');
s:=ExpandConstant('{tmp}')+'\music.mp3';
ShellExec('play',  s,  '',  '',  SW_HIDE,  ewNoWait,  res);
If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1', 'UninstallString', ResultStr) then
begin
 If ResultStr<>'' then
 begin
  ResultStr:=RemoveQuotes(ResultStr);
  If MsgBox('Программа My Program уже установлена, удалить ее?', mbInformation, MB_OKCANCEL)=IDOK then
  InstExec(ResultStr, '', '', True, False, SW_SHOW, res)
  else
  begin
   Result:=False;
   exit;
  end;
 end;
end;
Result:=True;
end;
Подняться вверх 
 
Сообщение #41
Гость_Kindly_*
сообщение 21:05:2005, 14:40
Цитата Ответить 





Инопланетный гость






    


Спасибо Вам, будем пробоватьsmile.gif.
Подняться вверх 
 
Сообщение #42
Гость_Kindly_*
сообщение 22:05:2005, 14:46
Цитата Ответить 





Инопланетный гость






    


Получилось, но всё равно немного переделал под пятую версию:

Цитата
function InitializeSetup(): Boolean;
var
res:Integer;
ResultCode: Integer;
s, ResultStr:string;
begin
ExtractTemporaryFile('Temp_Program.exe');
s:=ExpandConstant('{tmp}')+'\Temp_Program.exe';
Exec(s, '', '', SW_SHOWMINIMIZED, ewNOWait, res);
Result:=True;
begin
If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Restorator 2005_is1', 'UninstallString', ResultStr)
then
begin
If ResultStr<>''
then
begin
ResultStr:=RemoveQuotes(ResultStr);
If MsgBox('Программа My Program уже установлена, удалить ее?', mbInformation, MB_OKCANCEL)=IDOK
then
  if not Exec(ResultStr, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode)
then
  MsgBox('Ошибка удаления. ' #13#13 '' + SysErrorMessage(ResultCode) + '.' #13#13 'Вероятно, деинсталлятор был перемещен, удален или переименован.', mbError, MB_OK);
end;
end;
end;
end;


Вопрос следующий: как закрыть (или завершить процесс) программу, запущенную из временной папки перед завершением установки, используя средства Inno Setup? Это ведь лучше через процедуру DeInitializeSetup делать?
У меня после успешного решения данного вопроса сразу отпадает потребность воспроизведения *.xm и *.mod, т.к. уже найден конвертер этих файлов в EXE. На данный момент это последнее, что меня интересует. Поможете?
Подняться вверх 
 
Сообщение #43
zubr
Вставить ник
сообщение 23:05:2005, 17:32
Цитата Ответить 


Божественный
Иконка группы

Группа: Модеры
Сообщений: 937
Регистрация: 19:11:2003
Пользователь №: 133



Репутация:   16  


Цитата
Вопрос следующий: как закрыть (или завершить процесс) программу, запущенную из временной папки перед завершением установки, используя средства Inno Setup?

Если программка Temp_Program.exe не консольная, то можно передать ей сообщение WM_CLOSE, иначе проблема сложнее, средствами InnoSetup не получится.
procedure DeInitializeSetup();
var
 h:Longint;
begin
h:=FindWindowByClassName('WMPlayerApp');
If h<>0 then
SendMessage(h, 16, 0, 0);
end;

Здесь 'WMPlayerApp' класс окна закрываемого приложения, чтобы его определить можно воспользоваться программой VIEWWIND.
Подняться вверх 
 
Сообщение #44
Гость_Kindly_*
сообщение 25:05:2005, 08:05
Цитата Ответить 





Инопланетный гость






    


Спасибо, очень интересно. Я вот не знаю даже: сама программка Temp_Program.exe не консольная, т.е. обычное Win32 приложение, которое напоминает классический интерфейс Winamp-а, но она создана консольным "Досовским" приложением, поэтому я теряюсь в точном ответе, т.к. не знаю, может ли считаться программа Win32, если она была создана Досовским/консольным приложением. Но судя по всем признакам (проверка PE анализаторами) - программка не консольная.
Получается, что дело остаётся "за малым". Какую-то программу VIEWWIND я нашёл через поисковик, но что-то сомневаюсь, что она может определить класс окна приложения. Сама по себе она консольная и даже не имеет описания, как ей пользоваться, даже не запускается через командную строку (возможно, это исходникиsad.gif. Поэтому я прошу Вас очень, - укажите, пожалуйста, ссылку, по которой можно скачать данную программу.
Подняться вверх 
 
Сообщение #45
zubr
Вставить ник
сообщение 26:05:2005, 03:35
Цитата Ответить 


Божественный
Иконка группы

Группа: Модеры
Сообщений: 937
Регистрация: 19:11:2003
Пользователь №: 133



Репутация:   16  


В вашем случае, если при проигрывании звукового файла, вы закрываете программку Temp_Program.exe и проигрывание прекращается, то все должно получиться.
Программу ViewWindow отправил вам на Email.
Подняться вверх 
 
Сообщение #46
Гость_Kindly_*
сообщение 26:05:2005, 06:42
Цитата Ответить 





Инопланетный гость






    


Спасибо большое. Очень хорошая программка.
Подняться вверх 
 
Сообщение #47
Гость_Kindly_*
сообщение 27:05:2005, 06:03
Цитата Ответить 





Инопланетный гость






    


Всё получилось, только есть один момент:

Код

Цитата
procedure DeInitializeSetup();
var
h:Longint;
begin
h:=FindWindowByClassName('XM-EXE-WINDOW');
If h<>0 then
SendMessage(h, 16, 0, 0);
begin
MsgBox('Работа мастера завершена.', mbInformation, MB_OK);
end;
end;


Когда инсталлятор закрывается, программа Temp_Program.exe закрывается, но не удаляется, т.к. видимо не хватает времени для выгрузки из временной директории. Поэтому мне пришлось "схитрить", вставив соответствующее сообщение. Вопрос: можно ли заставить выгружаться временные файлы (в данном случае) при выходе инсталлятора без соответствующего сообщения, например, сделать задержку?

И ещё один, думаю, понравитсяsmile.gif.
Есть такая директива AppMutex. Эта директива используется для предотвращения установки новой версии программы, если программа выполняется в данный момент, и удаления запущенного в данный момент приложения. В ней нужно указать ограничители. Если ограничители присутствуют, инсталятор/деинсталятор выдаст сообщение: "[Setup или Uninstall] обнаружил, что [AppName] выполняется. Пожалуйста, завершите работу приложения, а потом нажмите ОК для продолжения или Cancel для отмены". Но для этого нужно добавление в программу/инсталлятор соответствующего кода. Например, вот код на Delphi:

Цитата
CreateMutex(nil, False, 'MyProgramsMutexName');


А в секции Setup после этого прописать следующее:

Цитата
AppMutex=MyProgramsMutexName


Вот только не знаю как расписать код для создания Mutex.
Если Вам не сложно, напишите, пожалуйста, примерчик.
Подняться вверх 
 
Сообщение #48
zubr
Вставить ник
сообщение 28:05:2005, 04:20
Цитата Ответить 


Божественный
Иконка группы

Группа: Модеры
Сообщений: 937
Регистрация: 19:11:2003
Пользователь №: 133



Репутация:   16  


Цитата
Вопрос: можно ли заставить выгружаться временные файлы (в данном случае) при выходе инсталлятора без соответствующего сообщения, например, сделать задержку?

Попробуйте вместо функции MsgBox поставить функцию Sleep(500) - здесь аргумент 500 количество милисекунд задержки.
Цитата
Есть такая директива AppMutex. Эта директива используется для предотвращения установки новой версии программы, если программа выполняется в данный момент, и удаления запущенного в данный момент приложения.

Есть смысл использовать данную директиву, если вы делаете инсталлятор для своей программы, в которой вы можете установить мутекс, как в Help написано CreateMutex(nil, False, 'MyProgramsMutexName'). В вашем случае так не получится, но можно исхитриться по другому, все через тот же класс окна:
function InitializeSetup(): Boolean;
var
 h:Longint;
begin
Result:=True;
h:=FindWindowByClassName('ClassWindowInstallProg');//ClassWindowInstallProg - класс окна программы, которую вы устанавливаете
If h<>0 then
begin
//здесь вы можете выдать сообщение, что открыта программа
SendMessage(h, 16, 0, 0);//закрытие программы
//можно не закрывать программу, а выдать сообщение и закрыть инсталлятор
Result:=False;//закрытие инсталлятора
end;

end;
Подняться вверх 
 
Сообщение #49
Гость_Kindly_*
сообщение 28:05:2005, 07:16
Цитата Ответить 





Инопланетный гость






    


Спасибо большое. Думаю, разберусь с этим и всё будет правильно работать.
Zubr, а Вы настоящий Гуру в написании скрипта для инсталлятора (да и не только, наверноеsmile.gif.
Подняться вверх 
 
Сообщение #50
Гость_Kindly_*
сообщение 31:05:2005, 13:58
Цитата Ответить 





Инопланетный гость






    


У меня созрел вопрос "косметического" характера:
Видел инсталляторы (Inno Setup), в которых в фоновое окно вставлено изображение, причём отличающееся от изображения, которое на панели мастера.
Я только знаю, как вывести в фоновое окно изображение мастера:
Цитата
procedure InitializeWizard();
var
  BackgroundBitmapImage: TBitmapImage;
begin
  CreateTheWizardPages;
  BackgroundBitmapImage := TBitmapImage.Create(MainForm);
  BackgroundBitmapImage.Left := 50;
  BackgroundBitmapImage.Top := 100;
  BackgroundBitmapImage.AutoSize := True;
  BackgroundBitmapImage.Bitmap := WizardForm.WizardBitmapImage.Bitmap;
  BackgroundBitmapImage.Parent := MainForm;
end;

А как вывести внешнее изображение не знаю. Может Вы сталкивались с такой ситуацией?
И ещё один: при установке на панели выбора папки установки отображается количество требуемого дискового пространства. Как сделать, чтобы чуть выше отображалась информация о доступном пространстве на выбранном диске?
Подняться вверх 
 
Сообщение #51
zubr
Вставить ник
сообщение 3:06:2005, 03:49
Цитата Ответить 


Божественный
Иконка группы

Группа: Модеры
Сообщений: 937
Регистрация: 19:11:2003
Пользователь №: 133



Репутация:   16  


Цитата
Видел инсталляторы (Inno Setup), в которых в фоновое окно вставлено изображение, причём отличающееся от изображения, которое на панели мастера.

Вы уверены, что это было сделано в InnoSetup? В InnoSetup (4-ая версия) я такой возможности не нашел.
Цитата
при установке на панели выбора папки установки отображается количество требуемого дискового пространства. Как сделать, чтобы чуть выше отображалась информация о доступном пространстве на выбранном диске?

Не знаю, никогда не сталкивался с этим вопросом. Будет время посмотрю.
Подняться вверх 
 
Сообщение #52
zubr
Вставить ник
сообщение 5:06:2005, 15:34
Цитата Ответить 


Божественный
Иконка группы

Группа: Модеры
Сообщений: 937
Регистрация: 19:11:2003
Пользователь №: 133



Репутация:   16  


Цитата
В InnoSetup (4-ая версия) я такой возможности не нашел.

Извиняюсь, есть такая возможность.
[Setup]
WindowVisible=yes

[Files]
Source: "MyImage.bmp"; Flags: dontcopy

[code]
procedure InitializeWizard();
var
 BackgroundBitmapImage: TBitmapImage;
 BackgroundBitmapText: TNewStaticText;
 s:string;
 bitmap:TBitmap;
begin
 ExtractTemporaryFile(MyImage.bmp');
 s:=ExpandConstant('{tmp}')+'\MyImage.bmp';
 BackgroundBitmapImage := TBitmapImage.Create(MainForm);
 BackgroundBitmapImage.AutoSize := True;
 BackgroundBitmapImage.Bitmap.LoadFromFile(s);
 BackgroundBitmapImage.Left := 50;
 BackgroundBitmapImage.Top := 100;
 BackgroundBitmapImage.Parent := MainForm;
   BackgroundBitmapText := TNewStaticText.Create(MainForm);
 BackgroundBitmapText.Caption := 'TBitmapImage';
 BackgroundBitmapText.Left := BackGroundBitmapImage.Left;
 BackgroundBitmapText.Top := BackGroundBitmapImage.Top +    BackGroundBitmapImage.Height + 8;
 BackgroundBitmapText.Parent := MainForm;
end;

Здесь MyImage.bmp - внешнее изображение.
Цитата
при установке на панели выбора папки установки отображается количество требуемого дискового пространства. Как сделать, чтобы чуть выше отображалась информация о доступном пространстве на выбранном диске?

Сделать можно, но очень гиморно.
Подняться вверх 
 
Сообщение #53
Гость_Kindly_*
сообщение 6:06:2005, 07:06
Цитата Ответить 





Инопланетный гость






    


Спасибо большое. Я уже хотел в доказательство Вам скриншоты на мыло выслать wink.gif. А со вторым вопросом напрягать Вас не буду.
Подняться вверх 
 
Сообщение #54
Гость_Kindly_*
сообщение 7:06:2005, 07:09
Цитата Ответить 





Инопланетный гость






    


Хорошо. А как можно замостить фоновую картинку так, чтобы при любом изменении разрешения экрана она оставалась растянутой до краёв, чтобы не выходила за пределы фонового окна и чтобы меньше его не была? В виденных мной инсталляторах именно так и было. Я 2 часа промучался, но так и не достиг требуемого результата.
Подняться вверх 
 
Сообщение #55
zubr
Вставить ник
сообщение 7:06:2005, 17:37
Цитата Ответить 


Божественный
Иконка группы

Группа: Модеры
Сообщений: 937
Регистрация: 19:11:2003
Пользователь №: 133



Репутация:   16  


Цитата
Я 2 часа промучался, но так и не достиг требуемого результата.

Ну 2 часа это не много, бывает приходится мучиться 2 дня, а то и 2 недели cool.gif
Вот код решающий ваш вопрос:
procedure InitializeWizard();
var
BackgroundBitmapImage: TBitmapImage;
s:string;
bitmap:TBitmap;
begin
ExtractTemporaryFile(MyImage.bmp');
s:=ExpandConstant('{tmp}')+'\MyImage.bmp';
BackgroundBitmapImage := TBitmapImage.Create(MainForm);
BackgroundBitmapImage.Bitmap.LoadFromFile(s);
BackgroundBitmapImage.Left := 0;
BackgroundBitmapImage.Top := 0;
BackgroundBitmapImage.Width:=MainForm.ClientWidth;
BackgroundBitmapImage.Height:=MainForm.ClientHeight;
BackgroundBitmapImage.Parent := MainForm;
BackgroundBitmapImage.Stretch:=True;
end;
Подняться вверх 
 
Сообщение #56
Гость_Kindly_*
сообщение 9:06:2005, 06:50
Цитата Ответить 





Инопланетный гость






    


Просто класс! То что нужно.
Подняться вверх 
 
Сообщение #57
Гость_Snаke_*
сообщение 21:06:2005, 01:07
Цитата Ответить 





Инопланетный гость






    


Здраствуйте. Я в Inno Setup начал делать инсталляторы неда