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

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

Аватара для Johny777

Ветеран


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

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


habib2302,
Цитата habib2302:
подскажите.как сделать чтобы перед установкой новой версии экзешник сначало удалял старую версию,а потом начинал установку новой версии »
раз уж пакуешь Аиду то неплохо бы удалить и офф. версии программы а не только свою. На их сайте нашёл 2 версии, и их апп-айди записал в константы
APPID_AIDA_EXTREME
APPID_AIDA_BUISNES
принцип работы кода такой:
1. в функцию GetUninstallPath() отправляем заполненный вручную массив записей апп-айди (в примере ниже 2 вышеупомянутых, включая тот что у твоего инсталла). Она возвращает
массив записей, в каждом элементе которого путь к экзешнику деинсталлятора для каждой программы, если он был найден
2. Если пользователь соглашается на вопрос месседжбокса об удалении найденных программ, то мы отправляем полученный массив путей в процедуру UninstallApps(), которая с ожиданием (спасибо примеру Serega - "ExecAndWait.iss" из шапки ), то бишь по-очереди вызывает деинсталяторы
3. Твой инсталл запустится только если повторный (через рекурсивный вызов ф-ции InitializeSetup() ) вызов функции GetUninstallPath() после пункта 1 и 2 вернёт массив длиной = 0
код:
читать дальше »
Код: Выделить весь код
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

AppId=TheBestAidaInstallEver

[ code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
    APPID_AIDA_EXTREME = 'AIDA64 Extreme Edition';
    APPID_AIDA_BUISNES = 'AIDA64 Business Edition';

    WAIT_OBJECT_0 = $0;
    STARTF_USESHOWWINDOW  = 1;
    NORMAL_PRIORITY_CLASS = $00000020;
    INFINITE = $FFFFFFFF;     { Infinite timeout }

type
    _STARTUPINFO = record
        cb: DWORD;
        #ifdef UNICODE
            lpReserved, lpDesktop, lpTitle: PAnsiChar;
        #else
            lpReserved, lpDesktop, lpTitle: PChar;
        #endif
        dwX, dwY, dwXSize, dwYSize, dwXCountChars, dwYCountChars, dwFillAttribute, dwFlags: DWORD;
        wShowWindow, cbReserved2: Word;
        lpReserved2: Byte;
        hStdInput, hStdOutput, hStdError: THandle;
    end;

    _PROCESS_INFORMATION = record
        hProcess: THandle;
        hThread: THandle;
        dwProcessId: DWORD;
        dwThreadId: DWORD;
    end;


function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
#ifdef UNICODE
function CreateProcess(lpApplicationName, lpCommandLine: PAnsiChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PAnsiChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#else
function CreateProcess(lpApplicationName, lpCommandLine: PChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#endif


function GetUninstallPath(const AppIds: array of String): array of String;
var
    StringList: TStringList;
    i, Len: Integer;
    Buff: String;
begin
    for i := 0 to GetArrayLength(AppIds)-1 do
    begin
        Buff := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppIds[i] + '_is1,UninstallString|}'));
        if Buff <> '' then
        begin
            Len := GetArrayLength(Result);
            SetArrayLength(Result, Len+1);
            Result[Len] := Buff;
        end;
    end;
end;


procedure UninstallApps(const UninstallPathes: array of String);
var
    pi: _PROCESS_INFORMATION;
    si: _STARTUPINFO;
    i: Integer;
begin
    for i := 0 to GetArrayLength(UninstallPathes)-1 do
    begin
        si.cb := SizeOf(si);
        si.dwFlags := STARTF_USESHOWWINDOW;
        si.wShowWindow := SW_SHOWNORMAL;
        #ifdef UNICODE
        if not CreateProcess('', PAnsiChar(UninstallPathes[i]), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
        #else
        if not CreateProcess('', PChar(UninstallPathes[i]), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
        #endif
        begin
            MsgBox(SysErrorMessage(DLLGetLastError), mbCriticalError, MB_OK);
            Exit;
        end;
        try
            while WaitForSingleObject(pi.hProcess, INFINITE) <> WAIT_OBJECT_0 do Application.ProcessMessages;
        finally
            CloseHandle(pi.hProcess);
            CloseHandle(pi.hThread);
        end;
    end;
end;


function InitializeSetup(): Boolean;
var
    i, Len: Integer;
    uArray: array of String;
begin
    uArray := GetUninstallPath( ['{#SetupSetting("AppID")}', APPID_AIDA_EXTREME, APPID_AIDA_BUISNES] );
    Len := GetArrayLength(uArray);
    Result := Len = 0;
    if not Result then if MsgBox('Перед установкой необходимо удалить все старые версии приложения, вызвать программы удаления сейчас?', mbError, MB_YESNO) = IDYES then
    begin
        UninstallApps(uArray);
        Result := InitializeSetup();
    end;
end;

если тебе нужно предварительное удаление только для твоего инсталла, то вот тебе упрощённый пример:
читать дальше »
Код: Выделить весь код
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

AppId=TheBestAidaInstallEver



[ code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
    
    WAIT_OBJECT_0 = $0;
    STARTF_USESHOWWINDOW  = 1;
    NORMAL_PRIORITY_CLASS = $00000020;
    INFINITE = $FFFFFFFF;     { Infinite timeout }

type
    _STARTUPINFO = record
        cb: DWORD;
        #ifdef UNICODE
            lpReserved, lpDesktop, lpTitle: PAnsiChar;
        #else
            lpReserved, lpDesktop, lpTitle: PChar;
        #endif
        dwX, dwY, dwXSize, dwYSize, dwXCountChars, dwYCountChars, dwFillAttribute, dwFlags: DWORD;
        wShowWindow, cbReserved2: Word;
        lpReserved2: Byte;
        hStdInput, hStdOutput, hStdError: THandle;
    end;

    _PROCESS_INFORMATION = record
        hProcess: THandle;
        hThread: THandle;
        dwProcessId: DWORD;
        dwThreadId: DWORD;
    end;


function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
#ifdef UNICODE
function CreateProcess(lpApplicationName, lpCommandLine: PAnsiChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PAnsiChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#else
function CreateProcess(lpApplicationName, lpCommandLine: PChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#endif


function UninstallMyApp(): Boolean;
var
    pi: _PROCESS_INFORMATION;
    si: _STARTUPINFO;
    Buff: String;
    i: Integer;
begin
    if MsgBox('Перед установкой необходимо удалить предыдущую версию приложения. Продолжить?', mbError, MB_YESNO) = IDNO then Exit;
    Buff := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,UninstallString|}'));
    Result := Buff = '';
    if not Result then
    begin
        si.cb := SizeOf(si);
        si.dwFlags := STARTF_USESHOWWINDOW;
        si.wShowWindow := SW_SHOWNORMAL;
        #ifdef UNICODE
        if not CreateProcess('', PAnsiChar(Buff), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
        #else
        if not CreateProcess('', PChar(Buff), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
        #endif
        begin
            MsgBox(SysErrorMessage(DLLGetLastError), mbCriticalError, MB_OK);
            Exit;
        end;
        try
            while WaitForSingleObject(pi.hProcess, INFINITE) <> WAIT_OBJECT_0 do Application.ProcessMessages;
        finally
            CloseHandle(pi.hProcess);
            CloseHandle(pi.hThread);
            Result := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,UninstallString|}')) = '';
        end;
    end;
end;


function InitializeSetup(): Boolean;
begin
    Result := UninstallMyApp();
end;
Это сообщение посчитали полезным следующие участники:

Отправлено: 01:29, 10-04-2013 | #141