Моё или какое-то иное аналогичное приложение было ранее уже установлено, если моё, то я точно знаю, как оно называется. А если чужое, то мне прописывать ВСЕ варианты его названия?
Подскажите, пожалуйста:
1. При запуске моего установщика, нужно это проверить через реестр по секции Uninstal, например, или по конкретному файлу в пути установки?
2. Предложить удалить это приложение (только предложить - если пользователь откажется, установку всё равно можно будет продолжить)?
3. Сменить путь установки (по умолчанию) на тот, по которому установлено, приложение ранее?
Т.е. я в скрипте задал, например, Program Files\My Program, установщик обнаружил, что приложение уже было ранее установлено - сообщить об этом пользователю с предложением удалить это приложение - он отказывается и ПУТЬ УСТАНОВКИ меняется, чтобы затереть ранее установленное приложение. Взять из реестра из секции Uninstal путь установки?
Есть ведь вот такой вот код, можно его как-то "доработать" и "модифицировать":
Подскажите, пожалуйста:
1. При запуске моего установщика, нужно это проверить через реестр по секции Uninstal, например, или по конкретному файлу в пути установки?
2. Предложить удалить это приложение (только предложить - если пользователь откажется, установку всё равно можно будет продолжить)?
3. Сменить путь установки (по умолчанию) на тот, по которому установлено, приложение ранее?
Т.е. я в скрипте задал, например, Program Files\My Program, установщик обнаружил, что приложение уже было ранее установлено - сообщить об этом пользователю с предложением удалить это приложение - он отказывается и ПУТЬ УСТАНОВКИ меняется, чтобы затереть ранее установленное приложение. Взять из реестра из секции Uninstal путь установки?
Есть ведь вот такой вот код, можно его как-то "доработать" и "модифицировать":
Код:
procedure GetInstalledProgramm(Param: String);
var
Names, cl: TArrayOfString;
i, ResultCode: Integer;
DisplayName, UninstallString: String;
begin
if RegGetSubkeyNames(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', Names) then for i := 0 to GetArrayLength(Names)-1 do
begin
RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + Names[i], 'DisplayName', DisplayName);
if Pos(Lowercase(Param), Lowercase(DisplayName)) > 0 then
begin
if MsgBox('Программа установки обнаружила уже установленную игру ' + DisplayName + '.'#13#13'Вы хотите предварительно удалить её?', mbInformation, MB_YESNO) = idYes then
begin
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + Names[i], 'UninstallString', UninstallString) then
begin
ReleaseMutex(hMutex);
CloseHandle(hMutex);
cl := argv(UninstallString);
if not Exec(cl[0], cl[1], '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
MsgBox('Ошибка удаления.'#13#10'' + SysErrorMessage(ResultCode) + '.'#13#10'Вероятно, деинсталлятор был перемещён, удалён или переименован.', mbError, MB_OK);
end;
end;
DisplayName := '';
UninstallString := '';
end;
end;
end;
procedure InitializeWizard();
begin
hMutex := WINAPI_CreateMutex(0, False, ExpandConstant('{#SetupSetting("AppMutex")}'));
GetInstalledProgramm('My Program');
CreateMutex('MyProgramMutexName');
end;
end;