Цитата Shkutu:
полный список инстансов вытащить из реестра можно при желании, но вот выбрать конкретный действительно не могу »
|
Shkutu, тогда вы пишете в реестр мусор.
Цитата Shkutu:
Деинсталлятор кладу в ту же папку, куда устанавливается экземпляр программы. »
|
Shkutu, вы все правильно сделали, это от вас я и хотел услышать. В каждой копии программы по деинсталлятору, удаляющего только саму копию и не трогая остальные. Только каждый из деинсталляторов должен быть готовым к удалению не только своей копии, но и родительской директории UCS, если он остался последним среди удаленных копий. Тоже самое и с реестром. Удаление файлов организовать через [UninstallDelete], удаление реестровых записей через [Registry] с нужными флагами:
читать дальше »
Код:
[UninstallDelete]
Type: filesandordirs; Name: {app}\UCS\instances\{code:GetInstanceName}
Type: dirifempty; Name: {app}\UCS\instances
Type: dirifempty; Name: {app}\UCS
[Registry]
Root: HKLM; Subkey: SOFTWARE\UCS; Flags: uninsdeletekeyifempty
Root: HKLM; Subkey: SOFTWARE\UCS\instances; Flags: uninsdeletekeyifempty
Root: HKLM; Subkey: SOFTWARE\UCS\instances\{code:GetInstanceName}; Flags: uninsdeletekeyifempty
Root: HKLM; Subkey: SOFTWARE\UCS\instances\{code:GetInstanceName}; ValueType: string; ValueName: path; ValueData: {app}\UCS\{code:GetInstanceName}; Flags: uninsdeletevalue
Цитата Shkutu:
деинсталлятора никаких страниц нет. »
|
Формы инсталлятора и деинсталлятора похожи и обе имеют страничный компонент TNewNotebook, так что ничто не мешает для деинсталлятора добавить свои страницы, только строить их с нуля нужно, шаблоны-функции Create*Page - это не для деинсталлятора. Вот пример, создается пустая страница, кнопка Далее для перехода на следующую страницу (если выборочных страниц больше одной делать, то необходима еще кнопка Назад), стандартная страница с прогрессом должна быть последней:
читать дальше »
Код:
//////////////////////////////////////////////////
procedure UninsNextButtonOnClick(Sender: TObject);
begin
with UninstallProgressForm.InnerNotebook do
begin
ActivePage := Pages[ActivePage.PageIndex + 1]; // go to next page
if ActivePage.PageIndex = PageCount-1 then // on last page...
begin
TButton(Sender).Hide; // ...hide Next button...
UninstallProgressForm.Close; // ...and close modal form
end;
end;
end;
////////////////////////////////////////////////////
procedure UninsCancelButtonOnClick(Sender: TObject);
begin
UninstallProgressForm.ModalResult := mrAbort;
end;
////////////////////////////////////////////
procedure InitializeUninstallProgressForm();
var
Page: TNewNotebookPage;
UninsNextButton: TButton;
begin
with UninstallProgressForm do
begin
// create Next button
UninsNextButton := TButton.Create(UninstallProgressForm);
with UninsNextButton do
begin
Parent := UninstallProgressForm;
Top := UninstallProgressForm.CancelButton.Top;
Width := UninstallProgressForm.CancelButton.Width;
Height := UninstallProgressForm.CancelButton.Height;
Left := UninstallProgressForm.CancelButton.Left - Width - ScaleX(10);
Caption := SetupMessage(msgButtonNext);
OnClick := @UninsNextButtonOnClick;
end;
// modify Cancel button
CancelButton.Enabled := True;
CancelButton.OnClick := @UninsCancelButtonOnClick;
// create custom page
Page := TNewNotebookPage.Create(UninstallProgressForm);
with Page do
begin
Parent := UninstallProgressForm.InnerNotebook;
Notebook := UninstallProgressForm.InnerNotebook;
PageIndex := 0; // first page
end;
// set active (first) page
InnerNotebook.ActivePage := InnerNotebook.Pages[0];
// default page to last page
InstallingPage.PageIndex := InnerNotebook.PageCount-1;
// show form
if ShowModal = mrAbort then Abort;
end;
end;