Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CreateProcess и WaitforSingleObject, процесс создается но заморожен 
:(
    Опции темы
B2_Russia
Дата 17.6.2006, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


В доску свой :)
**


Профиль
Группа: Участник
Сообщений: 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, но при этом завершается соответственно процесс установки моей проги и пользователь может запустить ее не установив Адоб (это не катит)

Все как обычно ГОРЮ ТОВАРИЩИ!!! smile
Сорс check.exe, но знающий человек скорее всего даст ответ не глядя в код smile :
Код

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 не причем 
PM WWW ICQ   Вверх
bems
Дата 18.6.2006, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



для начала, избавься от страшного цикла и киля процесс по хэндлу, который получил при создании 


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Mechanic
Дата 18.6.2006, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 1
Всего: 7



А зачем CREATE_NEW_CONSOLE
К тому же, интересно, а не завершается ли 'ar505enu.exe' чуть раньше, чем сама инсталлка завершится?
Бывает, что процесс завершается, породив один, или несколько дочерних процессов. При этом твоя запускалка уже не сможет контроллировать эти дочерние процессы.

Цитата(bems @  18.6.2006,  09:36 Найти цитируемый пост)
для начала, избавься от страшного цикла и киля процесс по хэндлу, который получил при создании  

А что за страшный цикл?
Код

 while WaitforSingleObject(PI.hProcess,INFINITE)=WAIT_TIMEOUT do
 begin
   KillTask('ar505enu.exe'); 
 end;

Этот что ли?
Так он не сработает, если процесс запустится.
 
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
bems
Дата 18.6.2006, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



Цитата(Mechanic @  18.6.2006,  20:01 Найти цитируемый пост)
Этот что ли?
Так он не сработает, если процесс запустится.
я сказал "для начала"



B2_Russia, какую из процедур ExecAndWait1 или ExecAndWait2 ты используешь? А то там у тебя столько следов отладки, что я не пойму с чего начать 


--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0862 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.