
В доску свой :)
 
Профиль
Группа: Участник
Сообщений: 344
Регистрация: 3.7.2003
Где: Тверь
Репутация: нет Всего: 1
|
Делаю инсталлятор для проги (InnoSetup) в конце инсталляции запускаю свою прогу (check.exe) которая проверяет версию виндов и в зависимости от версии (при отсутствии Acrobat) ставит либо Acrobat 6.0 (WinXP) либо 5.05 (Win2000). Во время установки инсталлятор ждет завершения моего приложения, так как мне важно чтобы пользователь не завершал установку моей проги и не запускал ее пока не поставится весь необходимый софт. В случае с Acrobat 6.0 все ок! Но, вне зависимости от системы при установке 5.05 возникает следующий баг: Процесс инсталлятора Acrobat-a 5.05 создается и на этом все, мой инсталлятор, check.exe и сетап акробата застывают... (такое ощущение что у сетапа акробата блокируется очередь сообщений) Все отмирает когда снимаю задачу check.exe, но при этом завершается соответственно процесс установки моей проги и пользователь может запустить ее не установив Адоб (это не катит) Все как обычно ГОРЮ ТОВАРИЩИ!!!  Сорс check.exe, но знающий человек скорее всего даст ответ не глядя в код  : Код | program check;
uses ShellAPI, Tlhelp32, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Registry, Dialogs, Forms, uMain in 'uMain.pas' {Form1};
Type TOSVersion=(osUnknown, osUnknown9x, osUnknownNT, osWin95, osWin98, osWin98SE, osWinME, osWinNT, osWin2000, osXP);
var IE:integer; h: hwnd; osv:TOSVersion;
{$R *.res}
function KillTask(ExeFileName: string): integer; const PROCESS_TERMINATE=$0001; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin result := 0;
FSnapshotHandle := CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := Sizeof(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
while integer(ContinueLoop) <> 0 do begin if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then Result := Integer(TerminateProcess(OpenProcess( PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0)); ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end;
CloseHandle(FSnapshotHandle); end;
function GetOSVersion : TOSVersion; var osVerInfo : TOSVersionInfo; majorVer, minorVer : Integer; begin result := OsUnknown; osVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); if GetVersionEx(osVerInfo) then begin majorVer := osVerInfo.dwMajorVersion; minorVer := osVerInfo.dwMinorVersion; case osVerInfo.dwPlatformId of VER_PLATFORM_WIN32_NT : Case majorVer of 4:result := OsWinNT; 5:if minorVer=0 then result := OsWin2000 else if minorVer=1 then result := OsXP else result := osUnknownNT; else result := osUnknownNT; end; {Case majorVer of} VER_PLATFORM_WIN32_WINDOWS : case majorVer of 4: Case minorVer of 0:result := OsWin95; 10: if osVerInfo.szCSDVersion[1] = 'A' then result := OsWin98SE else result := OsWin98; 90: result := OsWinME; else result := osUnknown9x; end;{Case minorVer of} else result := osUnknown9x; end{case majorVer of} else result := OsUnknown; end;{case osVerInfo.dwPlatformId of} end;{if GetVersionEx(osVerInfo) then} end;
function ExecAndWait1(const FileName, Params: ShortString; const WinState: Word): boolean; export; var StartInfo: TStartupInfo; ProcInfo: TProcessInformation; CmdLine: ShortString; begin { Помещаем имя файла между кавычками, с соблюдением всех пробелов в именах Win9x } CmdLine := '"' + Filename + '" ' + Params; FillChar(StartInfo, SizeOf(StartInfo), #0);
with StartInfo do begin cb := SizeOf(StartInfo); dwFlags := STARTF_USESHOWWINDOW; wShowWindow := WinState; end; Result := CreateProcess(nil, PChar( String( CmdLine ) ), nil, nil, false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, PChar(ExtractFilePath(Filename)),StartInfo,ProcInfo); { Ожидаем завершения приложения } if Result then begin WaitForSingleObject(ProcInfo.hProcess, INFINITE); { Free the Handles } CloseHandle(ProcInfo.hProcess); CloseHandle(ProcInfo.hThread); end; end;
function ExecAndWait(lpApplicationName, lpCommandLine: String; const WinState: Word): boolean; var pi : TProcessInformation; si : TStartupInfo; begin ZeroMemory(@si,sizeof(si)); si.cb:=SizeOf(si); if not CreateProcess( PChar(lpApplicationName), //pointer to name of executable module PChar(lpCommandLine), // Command line. nil, // Process handle not inheritable. nil, // Thread handle not inheritable. False, // Set handle inheritance to FALSE. 0, // No creation flags. nil, // Use parent's environment block. nil, // Use parent's starting directory. si, // Pointer to STARTUPINFO structure. pi ) // Pointer to PROCESS_INFORMATION structure. then begin Result:=false; RaiseLastWin32Error; Exit; end;
Sleep(10000); // while WaitforSingleObject(PI.hProcess,INFINITE)=WAIT_TIMEOUT do begin // KillTask('ar505enu.exe'); end; //application.ProcessMessages; //WaitForSingleObject(pi.hProcess,INFINITE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); end;
function CheckAdobe5:boolean; var Reg: TRegistry; begin result := false; Reg := TRegistry.Create; Reg.RootKey := HKEY_LOCAL_MACHINE; if Reg.KeyExists('Software\Adobe\Acrobat Reader\5.0\AdobeViewer') then begin Reg.OpenKey('Software\Adobe\Acrobat Reader\5.0\AdobeViewer', false); if Reg.ValueExists('TrustedMode') then begin result := true; end; end; end;
function CheckAdobe6:boolean; var Reg: TRegistry; begin result := false; Reg := TRegistry.Create; Reg.RootKey := HKEY_LOCAL_MACHINE; if Reg.KeyExists('Software\Adobe\Acrobat Reader\6.0\Installer') then begin Reg.OpenKey('Software\Adobe\Acrobat Reader\6.0\Installer', false); if Reg.ValueExists('Path') then begin result := true; end; end; end;
function CheckWinRar:boolean; var Reg: TRegistry; begin result := false; Reg := TRegistry.Create; Reg.RootKey := HKEY_LOCAL_MACHINE; if Reg.KeyExists('Software\Microsoft\Windows\CurrentVersion\App Paths\WinRar.exe') then begin result := true; end; end;
begin if not CheckWinRar then begin if MessageBox(0,'Для грамотной работы приложения необходима установка WinRar 3.51', 'Установка - Цифровые фотоаппараты: выбор и секреты', MB_OKCANCEL)=IDOK then //ExecAndWait('winrar351rus.exe', '',0); ExecAndWait1(ExtractFilePath(Paramstr(0))+'winrar351rus.exe', '', SW_SHOWNORMAL); end;
osv := GetOSVersion; if osv = osXP then begin //ShowMessage('xp'); if not CheckAdobe6 then begin if MessageBox(0,'Для грамотной работы приложения необходима установка Acrobat Reader 6.0', 'Установка - Цифровые фотоаппараты: выбор и секреты', MB_OKCANCEL)=IDOK then ExecAndWait('AdbeRdr602_rus_full.exe', '',0); end; end else begin if not CheckAdobe5 then begin if MessageBox(0,'Для грамотной работы приложения необходима установка Acrobat Reader 5.0', 'Установка - Цифровые фотоаппараты: выбор и секреты', MB_OKCANCEL)=IDOK then ExecAndWait(ExtractFilePath(Paramstr(0))+'ar505enu.exe', '', SW_SHOWNORMAL); end; end; end.
|
Добавлено @ 22:28 Да, походу WaitforSingleObject не причем
|