Как правильно проверить, при запуске установщика, установленно ли было приложение ранее?

NicTon

Новичок
Моё или какое-то иное аналогичное приложение было ранее уже установлено, если моё, то я точно знаю, как оно называется. А если чужое, то мне прописывать ВСЕ варианты его названия?

Подскажите, пожалуйста:

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;
 
Сверху