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

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

Аватара для habib2302

Ветеран


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

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


доброе время суток.Помогите мне решить одну проблему.Короче.я использую код для удаления других приложений.
Код: Выделить весь код
[ 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;
при первом запуске появляется диалог

но программа ранее не была установлена
вот мой скрипт

Отправлено: 14:07, 29-06-2013 | #710