Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1264
Благодарности: 1024

Профиль | Отправить PM | Цитировать


Цитата TROY Diamond:
Мне нужно, чтобы мой установщик при запуске находил уже ранее установленное приложение, НЕ только моим, НО и другими установщиками »
TROY Diamond, искать надо по значению ключа DisplayName. Пример (ищем Inno Setup QuickStart Pack, чтобы удалить):
читать дальше »

Код: Выделить весь код
[code]
function argv(Param: String): TArrayOfString;
begin
    SetArrayLength(Result, 2);
    case Param[1] of
        '"': begin
            Result[0] := Copy(Param, 2, Pos('.exe', Lowercase(Param))+2);
            Result[1] := RemoveQuotes(Trim(Copy(Param, Length(Result[0])+3, Length(Param))));
        end;
    else
        begin
            Result[0] := Copy(Param, 1, Pos('.exe', Lowercase(Param))+3);
            Result[1] := RemoveQuotes(Trim(Copy(Param, Length(Result[0])+1, Length(Param))));
        end;
    end;
end;


function GetInstalledProgramm(Param: String): Boolean;
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
            Result := True;
            if MsgBox('Программа установки обнаружила уже установленную программу ' + DisplayName + '.'#13#10'Вы желаете предварительно удалить ее?', mbInformation, MB_YESNO) = idYes then
            begin
                if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + Names[i], 'UninstallString', UninstallString) then
                begin
                    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;
            Break;
        end;
    end;
end;


procedure InitializeWizard();
begin
    GetInstalledProgramm('Inno Setup QuickStart Pack');
end;
Это сообщение посчитали полезным следующие участники:

Отправлено: 00:11, 01-01-2012