Возникла проблемка в работе инсталятора, помогите кто чем может...
Не могу заставить инсталятор при деинсталяции убить процесс(программу)...
[more=Вот код.][no];.:: Snake 60 ::. "Русификатор для LounchIt NOW! Plus 2006".
#include "SHFileOperation.iss"
[Setup]
;Название программы - инсталлятора, а также заголовок инсталлятора, (пожеланию можно версию указать):
AppName=Русификатор для LaunchIt NOW! Plus 2006
;Версия программы - инсталлятора, (пожеланию можно указать - название + версию):
AppVerName=Русификатор для LaunchIt NOW! Plus 2006
;Авторское право (в свойствах выходного файла компилятора):
AppCopyright=.:: Snake 60 ::.
;Версия программы - инсталлятора (в свойствах выходного файла компилятора):
VersionInfoVersion=1.0
;Информация об компании (в свойствах выходного файла компилятора):
VersionInfoCompany=.:: Snake 60 ::. RUS INC. (C) 2006-2007
;Описание (в свойствах выходного файла компилятора):
VersionInfoDescription=Русификатор для LaunchIt NOW! Plus 2006
;Используется для определения содержимого вкладки "Поддержка" диалога Установка\Удаление программ на Панели управления в Windows 2000/XP.
AppPublisher=Packaged by .:: Snake 60 ::.
;Директория установки для программы - инсталлятора:
DefaultDirName={pf}\LaunchIt NOW! Plus
;Название выходного файла компилятора:
OutputBaseFilename=launchit.now!.plus.2006.russian.translation-setup
;Директория выходного файла компилятора:
OutputDir=Output
;Имя\Место расположения файла с лицензией в формате ".txt" или ".rtf", который отображается после нажатия на кнопку далее.
LicenseFile=tmp_files\License.rtf
;Имя\Место расположения файла с информацией в формате ".txt" или ".rtf", который отображается после лицензионного соглашенья.
InfoBeforeFile=tmp_files\Readme_rus.rtf
;Метод сжатия данных в инсталляторе:
Compression=lzma/ultra
;Созидание непрерывного архива:
SolidCompression=yes
;Определяет новую иконку для программы - инсталлятора.
SetupIconFile=data_for_iss\orange-install.ico
;Определяет картинку в формате ".bmp", которая будет отображаться в левой части окна инсталлятора. Размер картинки "164x314" пикселей.
WizardImageFile=data_for_iss\WizardImage.bmp
;Определяет картинку в формате ".bmp", которая будет отображаться в правом верхнем углу окна мастера. Максимальный размер картинки 55х55 пикселей.
WizardSmallImageFile=data_for_iss\WizardSmallImage.bmp
;Означает создавать ли автоматический деинсталлятор. При значении "yes" он создается. При значении "no" автоматическое удаление будет невозможно, так что пользователь должен будет вручную удалять программу.
Uninstallable=yes
;Изменяет иконку на странице "Установка и удаление программ" в Панели управления
UninstallDisplayIcon={app}\orange-uninstall.ico
;Место расположения деинсталлятора (по умолчанию значение - UninstallFilesDir={app})
UninstallFilesDir={app}\Install_Rus
;Режим создания "лога" для деинсталлятора
UninstallLogMode=overwrite
;При значении "yes" файлы инсталлятора (параметры секции [Setup]) будут зашифрованы с помощью ARCFOUR с 128-битным ключом, сгенерированным из директивы Password секции [Setup]. Поддержка шифрования не включена в Inno Setup напрямую, ее следует скачать и установить отдельно. Информацию об этом можно найти на английском сайте программы в разделе Downloads файл "ISCrypt.dll". Модуль ISCrypt.dll должен находиться в папке с компилятором.
Encryption=yes
;Пароль для нашей шифровки! Не добавляйте Unicode символы! Не все понимаются инсталлятором. Теперь инсталлятор в безопасности;). Имейте в виду, что шифруются только основные файлы.Следует еще запомнить, что в тех случаях, когда вы извлекаете во временную папку внешние файлы, не забудьте установить для них флаг noencryption в секции [Files].
Password=**Snake*60**
;Запрос на подверждение продолжения установки
DisableStartupPrompt=no
;При установки в существующую директории появится сообщение "Продолжить туда установку". Значение no не будет выдавать этого сообщения
DirExistsWarning=no
;Нас, возможно, не устраивает шрифт инсталлятора по умолчанию - исправим это:
;-Изменение размера шрифта может повлечь изменение размера самого инсталлятора - будьте осторожны.
[LangOptions]
LanguageName=Russian
LanguageID=$0419
LanguageCodePage=1251
DialogFontName=Tahoma
DialogFontSize=8
WelcomeFontName=Tahoma
WelcomeFontSize=11
TitleFontName=Arial
TitleFontSize=29
CopyrightFontName=Arial
CopyrightFontSize=8
;Язык всех диалогов в инсталляторе:
[Languages]
Name: russian; MessagesFile: Russian.isl
;Надпись внизу диалогов
[Messages]
;Надпись-статуса во время установки. По умолчанию "Распаковка файлов..."
StatusExtractFiles=Распаковка файлов русификации...
BeveledLabel=- Russian Translation by .:: Snake 60 ::. - [ALL-SofT.NeT.RU - TeaM]
;Выбор дополнительный задач\создание ярлыков:
[Tasks]
;Дополнительные задачи - создание резервной копии файлов
Name: src; Description: Создать резервную копию оригинальных файлов
[Files]
;Обновленныe файлы
;Флаг BeforeInstall: CreateBackup; обязателен создать резервную копию через procedure CreateBackup;
Source: app_rus_data\lnp.exe; DestDir: {app}; BeforeInstall: CreateBackup; Flags: uninsneveruninstall skipifsourcedoesntexist overwritereadonly ignoreversion
Source: app_rus_data\lnpshellext.dll; DestDir: {app}; BeforeInstall: CreateBackup; Flags: uninsneveruninstall skipifsourcedoesntexist overwritereadonly ignoreversion
Source: app_rus_data\cleanup.exe; DestDir: {app}\Add-Ons; BeforeInstall: CreateBackup; Flags: uninsneveruninstall skipifsourcedoesntexist overwritereadonly ignoreversion
Source: app_rus_data\revpwd.exe; DestDir: {app}\Add-Ons; BeforeInstall: CreateBackup; Flags: uninsneveruninstall skipifsourcedoesntexist overwritereadonly ignoreversion
Source: app_rus_data\shutdown.exe; DestDir: {app}\Add-Ons; BeforeInstall: CreateBackup; Flags: uninsneveruninstall skipifsourcedoesntexist overwritereadonly ignoreversion
Source: data_for_iss\orange-uninstall.ico; DestDir: {app}; BeforeInstall: CreateBackup; Flags: uninsneveruninstall skipifsourcedoesntexist overwritereadonly ignoreversion
;TMP - файлы
Source: tmp_files\BASSMOD.dll; DestDir: {tmp}; Flags: dontcopy noencryption
Source: tmp_files\music.xm; DestDir: {tmp}; Flags: dontcopy noencryption
Source: tmp_files\ISTask.dll; DestDir: {tmp}; Flags: dontcopy noencryption
;Удаление папок или файлов при деинсталяции
[UninstallDelete]
Type: filesandordirs; Name: {app}\Install_Rus
[Run]
;Запуск обновленного файла
Filename: {app}\lnp.exe; Description: Запустить русскую версию LaunchIt NOW! Plus 2006; Flags: nowait postinstall skipifsilent
[Code]
var
str: string;
MyArray: array of Char;
RestoreDir: TButton;
const
BASS_MUSIC_RAMP = 1; // (только для Fast Tracker .xm)
BASS_MUSIC_RAMPS = 2; // (только для Fast Tracker .xm)
BASS_MUSIC_LOOP = 4; // повторение
BASS_MUSIC_FT2MOD = 16; // играть .MOD как FastTracker 2
BASS_MUSIC_PT1MOD = 32; // играть .MOD как ProTracker 1
BASS_MUSIC_SURROUND = 512; // звучание surround
BASS_MUSIC_SURROUND2 = 1024; // звучание surround (режим 2)
function BASSMOD_Init(device: Integer; freq, flags: DWORD): Boolean;
external 'BASSMOD_Init@files:BASSMOD.dll stdcall delayload';
function BASSMOD_MusicLoad(mem: BOOL; f: PChar; offset: DWORD; length: DWORD; flags: DWORD): Boolean;
external 'BASSMOD_MusicLoad@files:BASSMOD.dll stdcall delayload';
procedure BASSMOD_MusicFree();
external 'BASSMOD_MusicFree@files:BASSMOD.dll stdcall delayload';
function BASSMOD_MusicPlay(): Boolean;
external 'BASSMOD_MusicPlay@files:BASSMOD.dll stdcall delayload';
function BASSMOD_MusicPause(): Boolean;
external 'BASSMOD_MusicPause@files:BASSMOD.dll stdcall delayload';
function BASSMOD_MusicStop(): Boolean;
external 'BASSMOD_MusicStop@files:BASSMOD.dll stdcall delayload';
procedure BASSMOD_Free();
external 'BASSMOD_Free@files:BASSMOD.dll stdcall delayload';
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';
procedure ButtonOnClick(Sender: TObject);
begin
WizardForm.DirEdit.Text := ExpandConstant('{pf}\LaunchIt NOW! Plus');
end;
procedure PlayButtonOnClick(Sender: TObject);
var
Name1: string;
begin
if not BASSMOD_MusicPlay then
begin
Name1 := ExpandConstant('{tmp}\music.xm');
if BASSMOD_MusicLoad(FALSE, PChar(Name1), 0, 0, BASS_MUSIC_LOOP or BASS_MUSIC_SURROUND) then
BASSMOD_MusicPlay;
end;
end;
procedure PauseButtonOnClick(Sender: TObject);
begin
BASSMOD_MusicPause;
end;
procedure StopButtonOnClick(Sender: TObject);
begin
BASSMOD_MusicStop;
BASSMOD_MusicFree;
end;
//Кнопка создать новую папку в при выборе директории установки
procedure DirOnClick(Sender: TObject);
var
res: Boolean;
UserSelectDir: string;
begin
UserSelectDir := WizardForm.DirEdit.Text;
res := BrowseForFolder('Выберите директорию для установки и нажмите ''ОК''', UserSelectDir, True);
if res then
begin
WizardForm.DirEdit.Text := UserSelectDir;
end;
end;
procedure BevelLabelOnClick(Sender: TObject);
var
ErrorCode: Integer;
begin
ShellExec('open', 'http://www.all-soft.net.ru', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;
function CheckPassword(Password: string): Boolean;
begin
WizardForm.PasswordEdit.Text := 'Вот и нет пароля';
WizardForm.PasswordPage.Free;
Result := True;
end;
function InitializeSetup(): Boolean;
begin
MyArray := ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
'!', '@', '#', '$', '%', '^', '&', '*', '(', ')'];
Result := True;
begin
//Поиск процесса который надо закрыть
if RunTask('lnp.exe', false) then
begin
if MsgBox('Программа установки русификатора обнаружила, что программа'#13'для которой установится русификатор запушена в данный момент. '#13#13' Закрыть программу?'#13#13 +
'"Да" - закроет и не сохранит измененные настройки в программе.' #13#13 +
'"Нет" - продолжит установку без закрытия. (Настоятельно рекомендуется нажать Да)', mbError, mb_YesNo) = idYes then
begin
KillTask('lnp.exe');
Result := True;
end else
Exit;
end;
Result := True;
end;
end;
//При деинсталляции нужно честно предупредить пользователя
function InitializeUninstall(): Boolean;
begin
//Поиск процесса который надо закрыть при удалении
if RunTask('lnp.exe', false) then
begin
if MsgBox('Программа удаления русификатора обнаружила, что программа'#13'для которой русификатор был установлен, запущена в данный момент. '#13#13' Закрыть программу?'#13#13 +
'"Да" - закроет запущенную программу.' #13#13 +
'"Нет" - продолжит удаление. (Настоятельно рекомендуется нажать Да)', mbError, mb_YesNo) = idYes then
begin
KillTask('lnp.exe');
Result := True;
end else
Exit;
end;
Result := True;
end;
//при запуске инсталлятора выполняем вот этот код:
procedure InitializeWizard();
var
Name1: string;
PlayButton, PauseButton, StopButton: TButton;
Panel1: TPanel;
begin
RestoreDir := TButton.Create(WizardForm);
RestoreDir.Width := WizardForm.DirBrowseButton.Width;
RestoreDir.Height := WizardForm.DirBrowseButton.Height;
RestoreDir.Top := WizardForm.DirBrowseButton.Top + RestoreDir.Height + ScaleX(10);
RestoreDir.Left := WizardForm.DirBrowseButton.Left;
RestoreDir.OnClick := @ButtonOnClick;
RestoreDir.Parent := WizardForm.SelectDirPage;
RestoreDir.Visible := True;
RestoreDir.Caption := 'Сбросить';
begin
//Вставляем наш пароль в поле ввода
WizardForm.DirBrowseButton.OnClick := @DirOnClick;
WizardForm.PasswordEdit.Visible := False;
WizardForm.PasswordEdit.Text := '';
ExtractTemporaryFile(ExpandConstant('BASSMOD.dll'));
ExtractTemporaryFile(ExpandConstant('music.xm'));
if not BASSMOD_Init(-1, 44100, 0)
then
begin
MsgBox('BASSMOD не смогла инициализироваться, проигрывание музыки невозможно.', mbError, MB_OK)
BASSMOD_Free;
end
else
begin
Name1 := ExpandConstant('{tmp}\music.xm');
if BASSMOD_MusicLoad(FALSE, PChar(Name1), 0, 0, BASS_MUSIC_LOOP or BASS_MUSIC_SURROUND) then
BASSMOD_MusicPlay;
begin
Panel1 := TPanel.Create(WizardForm);
with Panel1 do
begin
PlayButton := TButton.Create(WizardForm);
PlayButton.Left := 10;
PlayButton.Top := WizardForm.ClientHeight - ScaleY(23 + 10);
PlayButton.Height := 23; //Высота кнопки
PlayButton.Width := 30; //Ширина кнопки
PlayButton.Caption := '>'; //Название кнопки
PlayButton.OnClick := @PlayButtonOnClick;
PlayButton.Parent := WizardForm;
PlayButton.Cursor := crHand;
PauseButton := TButton.Create(WizardForm);
PauseButton.Left := 45;
PauseButton.Top := WizardForm.ClientHeight - ScaleY(23 + 10);
PauseButton.Height := 23; //Высота кнопки
PauseButton.Width := 30; //Ширина кнопки
PauseButton.Caption := 'II'; //Название кнопки
PauseButton.OnClick := @PauseButtonOnClick;
PauseButton.Parent := WizardForm;
PauseButton.Cursor := crHand;
StopButton := TButton.Create(WizardForm);
StopButton.Left := 80;
StopButton.Top := WizardForm.ClientHeight - ScaleY(23 + 10);
StopButton.Height := 23; //Высота кнопки
StopButton.Width := 30; //Ширина кнопки
StopButton.Caption := '[]'; //Название кнопки
StopButton.OnClick := @StopButtonOnClick;
StopButton.Parent := WizardForm;
StopButton.Cursor := crHand;
begin
with WizardForm do begin
with MainPanel do
Height := Height - 0;
with WizardSmallBitmapImage do begin
Left := 0;
Top := 0;
Height := 58; //Размер рисунка
Width := 500; //
end;
with PageNameLabel do begin
Width := Width - 500; //Поставьте здесь значения на 0 если хотите вернуть текст
Left := Left + 100; //
end;
with PageDescriptionLabel do begin
Width := Width - 500; //Поставьте здесь значения на 0 если хотите вернуть текст
Left := Left + 100; //
begin
with WizardForm.BeveledLabel do
begin
Cursor := crHand; //Вид курсора при наведении на текст
OnClick := @BevelLabelOnClick;
Font.Color := clBlue; //Цвет текста
Enabled := True;
end;
end;
end;
end;
end;
end
end;
end;
end;
end;
//Изменяем диалог установки
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpPassword then
begin
WizardForm.PasswordEdit.Text := MyArray[69] + MyArray[69] + MyArray[18] + MyArray[39] + MyArray[26] + MyArray[36] + MyArray[30] + MyArray[69] + MyArray[57] + MyArray[61] + MyArray[69] + MyArray[69]
IntToStr(StrToInt(str) - StrToInt(GetDateTimeString('ss', #0, #0)));
WizardForm.NextButton.OnClick(WizardForm.NextButton);
end;
begin
if CurPageID = wpWelcome then
begin
if WizardForm.FindComponent('NextButton') is TButton
then
TButton(WizardForm.FindComponent('NextButton')).Caption := 'Далее >>'; //текст
if WizardForm.FindComponent('CancelButton') is TButton
then
TButton(WizardForm.FindComponent('CancelButton')).Caption := 'Отмена'; //текст
end;
begin
if CurPageID = wpReady then
begin
if WizardForm.FindComponent('CancelButton') is TButton
then
TButton(WizardForm.FindComponent('CancelButton')).Caption := 'Отмена'; //текст
end;
end;
end;
end;
//При инсталляции, в "бэкап" сохраняются (перемещением) только те файлы,
//которые инсталлятор заменяет. При удалении, эти же файлы восстанавливаются (тоже перемещением).
function MoveFile(const srcFile, destFile: PChar): Integer;
external 'MoveFileA@kernel32.dll stdcall';
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
begin
MoveDir(ExpandConstant('{app}\Install_Rus\Backup\'), ExpandConstant('{app}'));
RemoveDir(ExpandConstant('{app}\Install_Rus\Backup\'));
RemoveDir(ExpandConstant('{app}\Install_Rus\'));
end;
end;
//Процедура создания резервной копии при выборе пункта "Создать резервную копию оригинальных файлов"
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}\Install_Rus\Backup') + shortPath;
ForceDirectories(ExtractFilePath(destFile));
MoveFile(PChar(srcFile), PChar(destFile));
end;
end;
//Чтобы заставить инсталлятор при нажатии на кнопку "Отмена" выдавать собственное сообщение, следует написать следующую процедуру:
procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
begin
Cancel := False;
Confirm := False;
if MsgBox('Вы действительно хотите прервать установку?', mbError, MB_YESNO) = idYes
then
Cancel := true;
end;
//Функция проверки директории на конкретный файл (пример - EX_chemax68.exe) если файл
//отсутствует то выдается сообщение об ошибке
function NextButtonClick(CurPage: Integer): Boolean;
var
s: string;
begin
str := GetDateTimeString('ss', #0, #0);
Result := True;
if CurPage = 6 then
begin
if (FileSearch('lnp.exe', ExpandConstant('{app}')) = '')
then
begin
s := 'Программа "LaunchIt NOW! Plus 2006" не найдена в данной директории!'#13#13'Пожалуйста, укажите папку с программой.';
MsgBox(s, mbError, mb_Ok);
Result := False
end;
end;
end;
end.
end;
[/no][/more]