PDA

Показать полную графическую версию : [архив] Inno Setup .:[все вопросы]:.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 [28] 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

volk1234
28-03-2009, 03:37
Serega_ и другие заинтересованные лица:

Я в Inno профан поэтому просьба к вам, посмотрите шапку- может чего лишнего убрать?
Допустим оставить только ссылку на версия 5.2.4 ?? Или 5.2.0 тоже нужна?
Жду предложений.

Serega
28-03-2009, 09:56
volk1234, как говорят, выскажу лично своё мнение...

Можно убрать:
Unpaker 2.0 , Зеркало, зеркало - распаковывает инсталляторы версии 5.2.2;
Inno Setup Pack 5.2.2 RU.

Немного перефразировать ссылку:
- Как убрать окно приветствия в мастере установки приложения: на - Как убрать страницу приветствия (wpWelcome) в мастере установки приложения:, я понимаю, что в такой форме вопрос был задан, но так более понятней...

Diman19
28-03-2009, 16:45
Всем привет!Скажите пожалуйста как создать отдельное окно для ввода ключа продукта?Вот пример
http://www.alphaleap.com/simspets/shot10man.gif

Спасибо!

Serega
30-03-2009, 02:45
как создать отдельное окно для ввода ключа продукта? »Сделал на странице приветствия

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Messages]
ClickNext=Вы должны ввести серийный номер, чтобы продолжить, или «Отмена», чтобы выйти из программы установки.

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

; заносим данные в реестр, 1 вариант
[Registry]
Root: HKCU; SubKey: Software\My Program; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\My Program\Settings; ValueType: string; ValueName: Serial; ValueData: {code:edtText}; Flags: uninsclearvalue

Code]
var
edt: array [1..5] of TEdit;
txt: TNewStaticText;
i, e, t: integer;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpWelcome then
WizardForm.NextButton.Enabled:= False; // отключаю кнопку Далее
end;

function edtText(s: string): string; //этот вариант, при записи через секцию [Registry]
//function edtText: string; // а этот, если вносить запись через 2 вариант
//var //
// s: string; //
begin
{ получаем текст из edit'ов и присваем переменной s }
for i:= 1 to 5 do begin
s:= s + edt[i].Text + '-';
end;
{ удаляем лишний знак тире в конце строки }
s:= Copy(s, 1, Length(s) - 1);
Result:= s;
end;

//procedure CurStepChanged(CurStep: TSetupStep);
//begin
// { занасим данные в реестр 2 вариант}
// If CurStep = ssDone then
// RegWriteStringValue(HKEY_CURRENT_USER, 'Software\My Program\Settings', 'Serial', edtText);
//end;

//procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
//begin
// { удаляем данные из реестра, 2 вариант
// Здесь надо быть очень внимательным, а то по неосторожности можно удалить весь раздел... :) }
// If CurUninstallStep = usDone then
// RegDeleteKeyIncludingSubkeys(HKEY_CURRENT_USER, 'Software\My Program');
//end;

procedure edtKeyPress(Sender: TObject; var Key: Char);
begin
{ здесь попытался реализовать, чтоб курсор автоматом перескакивал на следующий edit при вводе,
но есть косяк, если начать удалять через Backspace, то из-за SetFocus курсор снова перескакивает на уже очищенный edit }
for i:= 1 to 4 do begin
if Length(edt[i].Text) = 4 then edt[i+1].SetFocus;
end;
{ проверяем условие если все edit'ы заполненны, то делаем доступной кнопку Далее}
for i:= 1 to 5 do begin
if Length(edt[i].Text) >= 4 then
WizardForm.NextButton.Enabled:= True else
WizardForm.NextButton.Enabled:= False;
end;
end;

procedure CreateComponents;
begin
WizardForm.NextButton.Enabled:= False;
t:= 57;
e:= t;
// создаём 4 тире
for i:= 1 to 4 do begin
txt:= TNewStaticText.Create(WizardForm.WelcomePage);
with txt do begin
Parent:= WizardForm.WelcomePage;
Name:= 'txt' + IntToStr(i+1);
Left:= 173 + (t*i);
Top:= 182;
Caption:= '-';
AutoSize:= True;
Font.Height:= -13;
Font.Style:= [fsBold];
end;
end;
// создаём 5 edit'ов
for i:= 1 to 5 do begin
edt[i]:= TEdit.Create(WizardForm.WelcomePage);
with edt[i] do begin
Parent:= WizardForm.WelcomePage;
Left:= 123 + (e*i);
Top:= 180;
Width:= 47;
Height:= 21;
MaxLength:= 5;
OnKeyPress:= @edtKeyPress;
end;
end;
end;

procedure InitializeWizard();
begin
CreateComponents;
end;

Diman19
31-03-2009, 02:00
Спасибо за скрипт.А не подскажешь как сделать чтобы это всё было после окна приветствия?

Спасибо!

Serega
31-03-2009, 02:30
Diman19, так чего же сразу не сказали. Только не окна, а страницы... Сделал второй страницей
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Messages]
ClickNext=Вы должны ввести серийный номер, чтобы продолжить, или «Отмена», чтобы выйти из программы установки.

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

; заносим данные в реестр, 1 вариант
[Registry]
Root: HKCU; SubKey: Software\My Program; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\My Program\Settings; ValueType: string; ValueName: Serial; ValueData: {code:edtText}; Flags: uninsclearvalue

Code]
var
edt:array [1..5] of TEdit;
txt: TNewStaticText;
i, e, t: integer;
NewPage: TWizardPage;
lbl: TLabel;
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = NewPage.ID then
WizardForm.NextButton.Enabled:= False; // отключаю кнопку Далее
end;

function edtText(s: string): string; //этот вариант, при записи через секцию [Registry]
//function edtText: string; // а этот, если вносить запись через 2 вариант
//var //
// s: string; //
begin
{ получаем текст из edit'ов и присваем переменной s }
for i:= 1 to 5 do begin
s:= s + edt[i].Text + '-';
end;
{ удаляем лишний знак тире в конце строки }
s:= Copy(s, 1, Length(s) - 1);
Result:= s;
end;

//procedure CurStepChanged(CurStep: TSetupStep);
//begin
// { занасим данные в реестр 2 вариант}
// If CurStep = ssDone then
// RegWriteStringValue(HKEY_CURRENT_USER, 'Software\My Program\Settings', 'Serial', edtText);
//end;

//procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
//begin
// { удаляем данные из реестра, 2 вариант
// Здесь надо быть очень внимательным, а то по неосторожности можно удалить весь раздел... :) }
// If CurUninstallStep = usDone then
// RegDeleteKeyIncludingSubkeys(HKEY_CURRENT_USER, 'Software\My Program');
//end;

procedure edtKeyPress(Sender: TObject; var Key: Char);
begin
{ здесь попытался реализовать, чтоб курсор автоматом перескакивал на следующий edit при вводе,
но есть косяк, если начать удалять через Backspace, то из-за SetFocus курсор снова перескакивает на уже очищенный edit }
for i:= 1 to 4 do begin
if Length(edt[i].Text) = 4 then edt[i+1].SetFocus;
end;
{ проверяем условие если все edit'ы заполненны, то делаем доступной кнопку Далее}
for i:= 1 to 5 do begin
if Length(edt[i].Text) >= 4 then
WizardForm.NextButton.Enabled:= True else
WizardForm.NextButton.Enabled:= False;
end;
end;

procedure SerialPage;
begin
NewPage:= CreateCustomPage(wpWelcome, 'Ввод кода', 'бла бла бла и т.д. ');

WizardForm.NextButton.Enabled:= False;
t:= 57;
e:= t;
// создаём Label
lbl:=TLabel.Create(NewPage);
with lbl do begin
Left:= 0;
Top:= 0;
Width:= 417;
Height:= 28;
AutoSize:= False;
WordWrap:= True;
Caption:= 'Введите код, отпечатанный на последней странице обложки Руководства пользователя или на упаковке диска.';
Parent:= NewPage.Surface;
end;

// создаём 4 тире
for i:= 1 to 4 do begin
txt:= TNewStaticText.Create(NewPage);
with txt do begin
Parent:= NewPage.Surface;
Name:= 'txt' + IntToStr(i+1);
Left:= 50 + (t*i);
Top:= 50;
Caption:= '-';
AutoSize:= True;
Font.Height:= -13;
Font.Style:= [fsBold];
end;
end;
// создаём 5 edit'ов
for i:= 1 to 5 do begin
edt[i]:= TEdit.Create(NewPage);
with edt[i] do begin
Parent:= NewPage.Surface;
Left:= 0 + (e*i);
Top:= 47;
Width:= 47;
Height:= 21;
MaxLength:= 5;
OnKeyPress:= @edtKeyPress;
end;
end;
end;

procedure InitializeWizard();
begin
SerialPage;
end;

AnalogXP
02-04-2009, 12:11
Здравствуйте!

Только вчера перешел с NSIS на Inno Setup и возникло пара вопросов:

1. Если удаляем программу Х, то появляется сообщение о подтверждении. Так вот, после этого сообщения нужно запустить другую программу Y и только после ее закрытия, продолжить удаление X. Вот что сейчас у меня:
[UninstallRun]
Filename: {app}\Feedback.exe; Flags: waituntilidle
Программа Y появляется, но удаление продолжается, и сама Y остается в папке.

2. Как закрыть программу Х, если она работает, а пользователь запустил удаление программы? Или вывести сообщение что нужно закрыть программу перед удалением.

3. Как насильно удалить папку деисталированной программы (она у меня так и остается)?

4. Как найти и удалить папку из Application Data\MyProgram (чтобы работало и в XP и Vista)?

Заранее благодарен за помощь!

Serega
02-04-2009, 13:11
AnalogXP,
Так всё правильно, вы используете флаг waituntilidleЕсли установлен этот флаг, инсталляция остановится и подождет, пока пользователь введет необходимые ей данные, вместо того, чтобы ожидать окончания процесса. (Как функция Win32 WaitForInputIdle). Не комбинируется с nowait. Вам нужен флаг waituntilterminatedЕсли указан этот флаг, инсталлятор подождет, пока процесс полностью завершится. Обратите внимание, что этот флаг всегда задается по умолчанию (т.е. для того, чтобы инсталлятор подождал, пока завершится процесс, этот флаг указывать не обязательно). Указывается он только в комбинации с флагом shellexec - в этом случае это необходимо, если инсталлятор должен дождаться завершения процесса. Не комбинируется с флагами nowait и waituntilidle.
т.е. вам надо записать так:[UninstallRun]
Filename: {app}\Feedback.exe; Flags: waituntilterminated
напишите в секции Code, следующее:

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
If CurUninstallStep = usDone then
// проверяем существование папки после удаления программы
if DirExists(ExpandConstant('{userappdata}\My Program')) = True then
// если существует, то удаляем её со всеми подпапками и файлами которые остались
DelTree(ExpandConstant('{userappdata}\My Program'), True, True, True);
// путь к папке (Application Data) - {userappdata} - для текущего пользователя, {commonappdata} - для всех пользователей
end;

Должно работать и на Vista, но проверить негде.
По второму вопросу, чуть позже...

Serega
02-04-2009, 14:52
AnalogXP,
Вам потребутся ISTask.dll, которую прикрепил к сообщению.
Пример использования ISTask.dll:
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Files]
Source: ISTask.dll; DestDir: {app}; Flags: ignoreversion
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion

[Run]
Filename: {app}\MyProg.exe; Description: Запустить программу MyProg?; Flags: postinstall nowait skipifsilent

; ниже поправьте название секции
[_Code]
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@{app}\ISTask.dll stdcall delayload uninstallonly';

function KillTask(ExeFileName: string): Integer;
external 'KillTask@{app}\ISTask.dll stdcall delayload uninstallonly';

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usUninstall then
if RunTask('MyProg.exe', false) then begin
UninstallProgressForm.Visible := False;
if MsgBox('Обнаружена запущенная программа MyProg. Завершить?', mbConfirmation, mb_yesno) = idyes then begin
KillTask('MyProg.exe');
UnloadDll(ExpandConstant('{app}\ISTask.dll'));
UninstallProgressForm.Visible := True;
end else begin
MsgBox('Завершите работу программы MyProg, затем снова запустите программу удаления.', mbInformation, mb_ok);
UnloadDll(ExpandConstant('{app}\ISTask.dll'));
Abort;
end;
end else begin
UnloadDll(ExpandConstant('{app}\ISTask.dll'));
end;
end;

AnalogXP
02-04-2009, 16:23
Serega_, спасибо, то что нужно.
Вот только собственную папку так и не сумел удалить. Чего-то я не понял:


[_Code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
If CurUninstallStep = usDone then
begin
...
if DirExists(ExpandConstant('{app}') = True then
DelTree(ExpandConstant('{app}', True, True, True);
end;
end;

Serega
02-04-2009, 16:44
AnalogXP, значит из этой папки во время удаления запущен какой-то процесс... Попробуйте выяснить какой процесс запущен и используйте для него:
DelayDeleteFile(ExpandConstant('{app}\FileName'), 2);
procedure DelayDeleteFile(const Filename: String; const Tries: Integer);
Описание:
Попытается удалить Filename, повторяя попытки Tries раз, если файл используется. Задержка между попытками - 250 мсек.

AnalogXP
02-04-2009, 17:44
AnalogXP, значит из этой папки во время удаления запущен какой-то процесс... Попробуйте выяснить какой процесс запущен и используйте для него: »
Там остается только одна пустая папка 'language'. Из нее файлы также удаляются а вот сама...

Кстате предыдущий код вообще не компилируется (прошу прощения за ошибку). Вот измененный:
if DirExists('{app}') = True then
DelTree('{app}', True, True, True);
Но как уже сказал папка программы и вложенная, остаются.

Serega
02-04-2009, 18:24
Вот, реализовал интересный эффект - эффект печатной машинки, т.е. текст на мастере появляется не сразу, а по одной букве, что создаёт эффект того, что текст печатается...
; Интересный эффект для Вашего инсталлятора, эффект печатной машинки...
; Для нормальной работы у Вас должен быть установлен набор от Restools http://restools.hanzify.org/
; Подразумеваю под словом набор - InnoCompiler и ISCmplr, последние версии Вы можете найти на сайте Restools.
; Автор: Serega, http://forum.oszone.net/member.php?userid=88670

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

Code]
var
lbl1, lbl2: TLabel;
txt1, txt2: string;
i: Integer;
tmr1: TTimer;

procedure tmr1Timer(Sender: TObject);
begin
tmr1.Enabled:= False;

txt1:= WizardForm.WelcomeLabel1.Caption;
txt2:= WizardForm.WelcomeLabel2.Caption;

lbl1.Caption:= '';
for i:= 1 to Length(txt1) do begin
if Application.Terminated then Break; // контроль закрытия приложения и выход из цикла
lbl1.Caption:= lbl1.Caption + txt1[i];
Application.ProcessMessages;
Sleep(100); // время задержки между показом букв
end;

lbl2.Caption:= '';
for i:= 1 to Length(txt2) do begin
if Application.Terminated then Break; // контроль закрытия приложения и выход из цикла
lbl2.Caption:= lbl2.Caption + txt2[i];
Application.ProcessMessages;
Sleep(60); // время задержки между показом букв
end;
end;

procedure CreateComponents;
begin
// скрываем стандартные Label'ы
WizardForm.WelcomeLabel1.Hide;
WizardForm.WelcomeLabel2.Hide;

// задаём свои Label'ы
lbl1:= TLabel.Create(WizardForm);
with lbl1 do begin
Left:= WizardForm.WelcomeLabel1.Left;
Top:= WizardForm.WelcomeLabel1.Top;
Width:= WizardForm.WelcomeLabel1.Width;
Height:= WizardForm.WelcomeLabel1.Height;
AutoSize:= WizardForm.WelcomeLabel1.AutoSize;
WordWrap:= WizardForm.WelcomeLabel1.WordWrap;
Font.Style:= WizardForm.WelcomeLabel1.Font.Style;
Font.Size:= WizardForm.WelcomeLabel1.Font.Size;
Font.Color:= WizardForm.WelcomeLabel1.Font.Color;
Transparent:= True;
Caption:= '';
Parent:= WizardForm.WelcomePage;
end;

lbl2:=TLabel.Create(WizardForm);
with lbl2 do begin
Left:= WizardForm.WelcomeLabel2.Left;
Top:= WizardForm.WelcomeLabel2.Top;
Width:= WizardForm.WelcomeLabel2.Width;
Height:= WizardForm.WelcomeLabel2.Height;
AutoSize:= WizardForm.WelcomeLabel2.AutoSize;
WordWrap:= WizardForm.WelcomeLabel2.WordWrap;
Font.Style:= WizardForm.WelcomeLabel2.Font.Style;
Font.Size:= WizardForm.WelcomeLabel2.Font.Size;
Font.Color:= WizardForm.WelcomeLabel2.Font.Color;
Transparent:= True;
Caption:= '';
Parent:= WizardForm.WelcomePage;
end;

tmr1:= TTimer.Create(WizardForm);
with tmr1 do begin
Interval:= 500; // время задержки перед началом показа текста
OnTimer:= @tmr1Timer;
end;
end;

procedure InitializeWizard();
begin
CreateComponents;
end;

AnalogXP
02-04-2009, 19:38
[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppName=MyProgramName
AppVerName=MyProgramName 3.1
AppPublisher=MyCompany
DefaultDirName={pf}\MyProgramName
DefaultGroupName=MyProgramName
AllowNoIcons=yes
OutputDir=E:\Install\Programe\Programa\MyProgramName
OutputBaseFilename=MyProgramName_3.1
SetupIconFile=E:\Install\Programe\Programa\MyProgramName \in.ico
Uninstallable=yes
UninstallDisplayIcon={app}\unins000.exe, 2
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked

[Files]
Source: E:\Install\Programe\Programa\MyProgramName\Installer\MyProgramName .exe; DestDir: {app}; Flags: ignoreversion
Source: E:\Install\Programe\Programa\MyProgramName\Installer\LICENSE.TXT; DestDir: {app}; Flags: ignoreversion
Source: E:\Install\Programe\Programa\MyProgramName\Installer\sqlite3.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Install\Programe\Programa\MyProgramName\Installer\VIcon.bin; DestDir: {app}; Flags: ignoreversion
Source: E:\Install\Programe\Programa\MyProgramName\Installer\Feedback.exe; DestDir: {app}; Flags: ignoreversion
Source: E:\Install\Programe\Programa\MyProgramName\Installer\language\*; DestDir: {app}\language; Flags: ignoreversion recursesubdirs
Source: E:\Install\Programe\Programa\MyProgramName\Installer\un.ico; DestDir: {app}; Flags: ignoreversion
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: {group}\MyProgramName ; Filename: {app}\MyProgramName.exe
Name: {group}\{cm:ProgramOnTheWeb,MyProgramName }; Filename: http://www.mycompany.com/
Name: {group}\{cm:UninstallProgram,MyProgramName }; Filename: {uninstallexe}; IconFilename: {app}\un.ico
Name: {commondesktop}\MyProgramName; Filename: {app}\MyProgramName.exe; Tasks: desktopicon
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\MyProgramName; Filename: {app}\MyProgramName.exe; Tasks: quicklaunchicon

[Run]
Filename: {app}\MyProgramName.exe; Description: {cm:LaunchProgram,MyProgramName}; Flags: nowait postinstall skipifsilent

[Registry]
Root: HKCU; Subkey: Software\MyProgramName\Options\Position; Flags: uninsdeletekey

[UninstallRun]
Filename: {app}\Feedback.exe; Flags: waituntilterminated

[_Code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
If CurUninstallStep = usDone then // проверяем существование папки после удаления программы
begin
if DirExists(ExpandConstant('{userappdata}\MyProgramName')) = True then
DelTree(ExpandConstant('{userappdata}\MyProgramName'), True, True, True);
if DirExists('{app}') = True then
DelTree('{app}', True, True, True);
end;
end;

Serega
02-04-2009, 21:55
AnalogXP, в скрипте, у вас всё нормально, по крайней мере ошибок я не нашёл. Единственное, что в секции [Files], я бы записал так:

.........
[Files]
Source: E:\Install\Programe\Programa\MyProgramName\Installer\*; DestDir: {app}; Flags: ignoreversion createallsubdirs recursesubdirs
........

т.е. все файлы в одной строке. Если в папке Installer или её подпапках есть файлы, которые не надо включать в инсталлятор, то нужно использовать Excludes:

.........
[Files]
Source: E:\Install\Programe\Programa\MyProgramName\Installer\*; Excludes: FileName1.exe, FileName2.exe; DestDir: {app}; Flags: ignoreversion createallsubdirs recursesubdirs
........

т.е. перечисляем файлы через запятую, так же можно использовать переменные - *.txt
Да и используйте в своих сообщениях тег [ more][/more]

Хотя попробуете добавить ещё раз DelTree, т.е.

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
If CurUninstallStep = usDone then // проверяем существование папки после удаления программы
begin
if DirExists(ExpandConstant('{userappdata}\MyProgramName')) = True then
DelTree(ExpandConstant('{userappdata}\MyProgramName'), True, True, True);
if DirExists('{app}') = True then begin
DelTree('{app}', True, True, True);
DelTree('{app}', True, True, True);
end;
end;
end;

AnalogXP
02-04-2009, 21:58
т.е. все файлы в одной строке. »
Спасибо, я об этом знаю, просто у меня там действительно еще много лишних файлов для дистрибутива.

Что посоветуете, делать с папкой? Так и не хочет удалится. Как найти причину!?

Serega
02-04-2009, 22:03
AnalogXP, вы второй раз использовали DelTree?

AnalogXP
03-04-2009, 00:21
Ну так в примере выше все указал. Вот как стараюсь удалить:

[_Code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
If CurUninstallStep = usDone then // проверяем существование папки после удаления программы
begin
if DirExists(ExpandConstant('{userappdata}\MyProgramName')) = True then
DelTree(ExpandConstant('{userappdata}\MyProgramName'), True, True, True);
if DirExists('{app}') = True then
DelTree('{app}', True, True, True);
end;
end;

Проверяю если есть папка в Application Data и удаляю.
Проверяю если есть папка программы и также пробую удалить.
А вообще, когда вызывается эта процедура?

Serega
03-04-2009, 00:45
AnalogXP, я добавил в прошлое сообщение пример с кодом. Посмотрите внимательней... Там DelTree используется два раза. Попробуйте.

AnalogXP
03-04-2009, 02:44
AnalogXP, я добавил в прошлое сообщение пример с кодом. Посмотрите внимательней... Там DelTree используется два раза. Попробуйте. »
Хе-хе, прозевал :)
Работает спасибо!




© OSzone.net 2001-2012