Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-05-2008
Avatar de Black_Ocean
Black_Ocean Black_Ocean is offline
Miembro
 
Registrado: nov 2006
Posts: 128
Poder: 18
Black_Ocean Va por buen camino
¿Cómo puedo implementar CreateProcess con procesos multihilo?

Hola estimados colegas de ClubDelphi,

Estoy complicado con una rutina que estoy haciendo y ya que no se que más hacer. Ojalá me puedan echar una manito

Lo que necesito es que, al ejecutar un proceso, este espere a que termine completamente su ejecución, esto es, incluyendo otros hilos que genere (en pocas palabras, que soporte multihilo). Esto se da en la mayoría de los casos cuando se ejecutan desinstaladores/instaladores de aplicaciones.

Esta rutina que he logrado hacer con ayudas sólo sirve para un proceso, pero si este genera un hilo y termina su ejecución devuelve inmediato el control, a pesar de no haber terminado el segundo proceso que generó

He buscado en los tips de ClubDelphi y en todos los foros y ninguno soporta multihilo .

Este es mi código:

Código Delphi [-]
Win32CreateProcess(const FileName, Parameters: String; var ExitCode: DWORD; const Wait: DWORD = 0; const Hide: Boolean = False): Boolean;
var
  myInfo: SHELLEXECUTEINFO;
  iWaitRes: DWORD;
begin
  ZeroMemory(@myInfo, SizeOf(SHELLEXECUTEINFO));
  myInfo.cbSize := SizeOf(SHELLEXECUTEINFO);
  myInfo.fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_NO_UI;
  myInfo.lpFile := PChar(FileName);
  myInfo.lpParameters := PChar(Parameters);
  if Hide then
    myInfo.nShow := SW_HIDE
  else
    myInfo.nShow := SW_SHOWNORMAL;
  ExitCode := 0;
  Result := ShellExecuteEx(@myInfo);
  if Result then
  begin
    while WaitForSingleObject(myInfo.hProcess, 100) = WAIT_TIMEOUT do
      Application.ProcessMessages;

    iWaitRes := WaitForSingleObject(myInfo.hProcess, 100);

    if (iWaitRes = WAIT_TIMEOUT) then
    begin
      Result := False;
      TerminateProcess(myInfo.hProcess, 0);
    end;
    GetExitCodeProcess(myInfo.hProcess, ExitCode);
    CloseHandle(myInfo.hProcess);
  end;
end;

Espero que me puedan ayudar amigos.

De antemano, Muchas gracias y cordiales saludos

Última edición por Black_Ocean fecha: 14-05-2008 a las 09:10:44.
Responder Con Cita
  #2  
Antiguo 14-05-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Código Delphi [-]
program Project1;

uses Windows, tlhelp32;

var
 si: TStartupInfo = (cb: SizeOf(si));
 pi: TProcessInformation;
 hSnapshot, hProcess: Cardinal;
 pe: TProcessEntry32 = (dwSize: SizeOf(pe));

begin
 CreateProcess(nil, 'explorer.exe c:\windows', nil, nil, False, 0, nil, nil, si, pi);
 WaitForSingleObject(pi.hProcess, INFINITE);
 hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 if Process32First(hSnapshot, pe) then
  repeat
   if pe.th32ParentProcessID = pi.dwProcessId then
    begin
     hProcess := OpenProcess(SYNCHRONIZE, False, pe.th32ProcessID);
     if LongBool(hProcess) then
      begin
       WaitForSingleObject(hProcess, INFINITE);
       CloseHandle(hProcess);
      end;
    end;
  until not Process32Next(hSnapshot, pe);
 CloseHandle(hSnapshot);
end.

Nota; Tal vez para abrir algunos procesos "hijos" requieras habilitar el privilegio SeDebugPrivilege de tu proceso. También es aconsejable revises el ejemplo para poder revisar a los procesos hijos de los procesos hijos (procesos nietos y bisnietos del primero).

Saludos

Última edición por cHackAll fecha: 14-05-2008 a las 16:29:51. Razón: F7 & CloseHandle(hSnapshot);
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Hook a la API Createprocess l30 API de Windows 20 06-04-2014 03:38:29
Como implementar un cursor nuevo rauros OOP 4 28-07-2008 22:57:18
Como crear una aplicacion multihilo kurono Varios 9 20-04-2008 19:08:13
threads multihilo walito API de Windows 5 13-06-2007 19:34:26
ayuda!!! como implementar sql en delphi diablorojo1886 SQL 3 04-12-2006 02:02:25


La franja horaria es GMT +2. Ahora son las 01:55:26.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi