Автор: Snake_60
Дата сообщения: 11.04.2007 13:32
Ребята, помогите кто сечёт. Создал инсталятор он добавляет папки которые не существовали в проге, но после uninstall эти папки все равно остаются, как сделать правильно, чтобы полностью удалилось после uninstallа.
[more=Вот код] [no]
#include "SHFileOperation.iss"
[Setup]
AppName=Русификатор для CyberLink PowerDVD 7.3 Ultra
AppVerName=Русификатор для CyberLink PowerDVD 7.3 Ultra
AppCopyright=Snake 60
VersionInfoVersion=7.3
VersionInfoCompany=Snake 60 RUS INC. (C) 2006-2007
VersionInfoDescription=Русификатор для CyberLink PowerDVD
Установка\Удаление программ на Панели управления в Windows 2000/XP.
AppPublisher=Packaged by Snake 60
DefaultDirName={pf}\CyberLink\PowerDVD
OutputBaseFilename=setup-russian.translation.cyberlink.powerdvd.7.3.ultra
OutputDir=Output
LicenseFile=tmp_files\License.rtf
InfoBeforeFile=tmp_files\Readme_rus.rtf
Compression=lzma/ultra
SolidCompression=yes
SetupIconFile=data_for_iss\orange-install.ico
WizardImageFile=data_for_iss\WizardImage.bmp
WizardSmallImageFile=data_for_iss\WizardSmallImage.bmp
Uninstallable=yes
UninstallDisplayIcon=data_for_iss\orange-uninstall.ico
UninstallFilesDir={app}\Install_Rus
UninstallLogMode=overwrite
Encryption=yes
Password=****
DisableStartupPrompt=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]
Source: "app_rus_data\Language\Rus\DVD_RES.dll"; DestDir: "{app}\Language\Rus"; Flags: uninsneveruninstall skipifsourcedoesntexist overwritereadonly ignoreversion
Source: "app_rus_data\Language\Rus\OSD_MLang.dll"; DestDir: "{app}\Language\Rus"; Flags: uninsneveruninstall skipifsourcedoesntexist overwritereadonly ignoreversion
Source: "app_rus_data\Language\Rus\PwrDVDRC.dll"; DestDir: "{app}\Language\Rus"; Flags: uninsneveruninstall skipifsourcedoesntexist overwritereadonly ignoreversion
Source: "app_rus_data\Language\Rus\UI_RES.dll"; DestDir: "{app}\Language\Rus"; Flags: uninsneveruninstall skipifsourcedoesntexist overwritereadonly ignoreversion
Source: "app_rus_data\Language.ini"; DestDir: "{app}\Language"; BeforeInstall: CreateBackup; Flags: uninsneveruninstall skipifsourcedoesntexist overwritereadonly ignoreversion
Source: "app_rus_data\ShortCut.ini"; DestDir: "{app}\Language"; BeforeInstall: CreateBackup; Flags: uninsneveruninstall skipifsourcedoesntexist overwritereadonly ignoreversion
Source: "app_rus_data\OLRSubmission\REGrt_RUS.dll"; DestDir: "{app}\OLRSubmission"; Flags: uninsneveruninstall skipifsourcedoesntexist overwritereadonly ignoreversion
Source: "app_rus_data\Trial\TrialRes_Rus.dll"; DestDir: "{app}\Trial"; Flags: uninsneveruninstall skipifsourcedoesntexist overwritereadonly ignoreversion
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}\Language\Rus"
Type: files; Name: "{app}\OLRSubmission\REGrt_RUS.dll"
Type: files; Name: "{app}\Trial\TrialRes_Rus.dll"
[Run]
Filename: "{app}\PowerDVD.exe"; Description: "Запустить русскую версию CyberLink PowerDVD 7.3 Ultra"; 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}\CyberLink\PowerDVD');
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('PowerDVD.exe', false) then
begin
if MsgBox('Программа установки русификатора обнаружила, что программа'#13'для которой установится русификатор запушена в данный момент. '#13#13' Закрыть программу?'#13#13 +
'"Да" - закроет и не сохранит измененные настройки в программе.' #13#13 +
'"Нет" - продолжит установку без закрытия. (Настоятельно рекомендуется нажать Да)', mbError, mb_YesNo) = idYes then
begin
KillTask('PowerDVD.exe');
Result := True;
end else
Exit;
end;
Result := True;
end;
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);
var
Name1: string;
i: Integer;
begin
if CurPageID = wpPassword then
begin
WizardForm.PasswordEdit.Text := MyArray[69] + MyArray[69] + 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;
{
//Скрыть текущий файл установки (пример - C:\Program\MyProg.exe) во время установки
procedure InitializeWizard();
begin
WizardForm.FileNameLabel.Visible := False;
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('PowerDVD.exe', ExpandConstant('{app}')) = '')
then
begin
s := 'Программа "CyberLink PowerDVD 7.3 Ultra" не найдена в данной директории!'#13#13'Пожалуйста, укажите папку с программу.';
MsgBox(s, mbError, mb_Ok);
Result := False
end;
end;
end;
end.
end;
[/no]
[/more]