[Delphi]Problème avec CreateProcess / winexec

Statut
N'est pas ouverte pour d'autres réponses.

AcidBird

Elite
Lorsque j'essaye de lancer un exécutable à l'aide de la commande CreateProcess, winExec ou ShellExecute, le process est bien créé (il apparait dans la liste des process du task manager) mais le programme ne s'affiche jamais (rien n'apparait à l'écran). Quelqu'un a-t-il une idée d'ou cela pourrait provenir ?

Voila les différents code que j'utilise pour lancer des exe à partir d'un autre programme et qui a toujours fonctionné jusqu'à présent ...


ShellExexute :
....
shellExecute(self.Handle, PChar('open'),pChar(FileToExec),nil,nil ,SW_MAXIMIZE);
...

WinExec :
...
WinExec(pChar(FileToExec), SW_MAXIMIZE);
...

CreateProcess :

function ExecuteProgram( const ProgramName: String;
WaitUntilGone: Boolean;
var ID: Integer; {instance handle or process ID}
var Active: Boolean ): Boolean;
var
TSI: TStartupInfo;
TPI: TProcessInformation;
ECP: DWord;
begin
Result := False;
Active := True;
try
FillChar(TSI, SizeOf(TSI), 0);
TSI.CB := SizeOf(TSI);
if CreateProcess(PChar(ProgramName), nil, nil, nil, False,
DETACHED_PROCESS OR NORMAL_PRIORITY_CLASS, nil, nil, TSI, TPI) then
begin
ID := TPI.dwProcessID;
CloseHandle(TPI.hThread);
WaitForInputIdle(TPI.hProcess, 10000); {let process start!}
if WaitUntilGone then begin
repeat
Application.ProcessMessages;
GetExitCodeProcess(TPI.hProcess, ECP);
until (ECP <> STILL_ACTIVE) or Application.Terminated;
CloseHandle(TPI.hProcess);
end;
Result := True;
end;
finally
Active := False;
end;
end;
 
1er
OP
AcidBird

AcidBird

Elite
Bon ben pour ceux que ca intéresse ...

Pas moyen de fair tourner l'exe avec Winexec et CreateProcess, par contre, en utlisant un ShellExecute avec la commande Open sur un shortcut vers l'application, cela fonctionne :!: . Maintenant savoir pourquoi CreateProcess ne fonctionne pas là c'est autrechose :roll:
 

dagibbon

Elite
AcidBird a dit:
Bon ben pour ceux que ca intéresse ...

Pas moyen de fair tourner l'exe avec Winexec et CreateProcess, par contre, en utlisant un ShellExecute avec la commande Open sur un shortcut vers l'application, cela fonctionne :!: . Maintenant savoir pourquoi CreateProcess ne fonctionne pas là c'est autrechose :roll:
je ne connais pas la commande createprocess ... sinon avec shellexecute, tu mes sw_°shownormal, et ca devrait aller...

ShellExecute(handle, 'open' , pchar([Programme a executer]), pchar(''), 0, SW_SHOWNORMAL);

ca doit marcher non?

tu ne dois pas mettre self.handle, sinon tu le partages...et donc un des deux process n'en a pas.

Ps: evites les 'nil' pour les shellexec ... ca sent le buffer overflow a plein nez ca...
 

titloup

Elite
AcidBird a dit:
Bon ben pour ceux que ca intéresse ...

Pas moyen de fair tourner l'exe avec Winexec et CreateProcess, par contre, en utlisant un ShellExecute avec la commande Open sur un shortcut vers l'application, cela fonctionne :!: . Maintenant savoir pourquoi CreateProcess ne fonctionne pas là c'est autrechose :roll:
Je pense que c'est pour lancer un processus en tâche de fond les autres ^^

J'ai aussi utilisé ShellExecute quelques fois :wink:
 

lEcEd

Touriste
AcidBird a dit:
Lorsque j'essaye de lancer un exécutable à l'aide de la commande CreateProcess, winExec ou ShellExecute, le process est bien créé (il apparait dans la liste des process du task manager) mais le programme ne s'affiche jamais (rien n'apparait à l'écran). Quelqu'un a-t-il une idée d'ou cela pourrait provenir ?

Voila les différents code que j'utilise pour lancer des exe à partir d'un autre programme et qui a toujours fonctionné jusqu'à présent ...


ShellExexute :
....
shellExecute(self.Handle, PChar('open'),pChar(FileToExec),nil,nil ,SW_MAXIMIZE);
...

WinExec :
...
WinExec(pChar(FileToExec), SW_MAXIMIZE);
...

CreateProcess :

function ExecuteProgram( const ProgramName: String;
WaitUntilGone: Boolean;
var ID: Integer; {instance handle or process ID}
var Active: Boolean ): Boolean;
var
TSI: TStartupInfo;
TPI: TProcessInformation;
ECP: DWord;
begin
Result := False;
Active := True;
try
FillChar(TSI, SizeOf(TSI), 0);
TSI.CB := SizeOf(TSI);
if CreateProcess(PChar(ProgramName), nil, nil, nil, False,
DETACHED_PROCESS OR NORMAL_PRIORITY_CLASS, nil, nil, TSI, TPI) then
begin
ID := TPI.dwProcessID;
CloseHandle(TPI.hThread);
WaitForInputIdle(TPI.hProcess, 10000); {let process start!}
if WaitUntilGone then begin
repeat
Application.ProcessMessages;
GetExitCodeProcess(TPI.hProcess, ECP);
until (ECP <> STILL_ACTIVE) or Application.Terminated;
CloseHandle(TPI.hProcess);
end;
Result := True;
end;
finally
Active := False;
end;
end;
Pour le CreateProcess:

dans ta structure LPSTARTUPINFOW (TSI) tu as un champs qui définit si tu veux voir la windows de ton process ou pas, tout dépend comment tu as définit ta structure TSI, mais normalement ce champs devrait s'appeler wShowWindow (ou un truc du genre). Suivant la valeur que tu mets dans ce champs le createprocess va te montrer ou te cacher ta fenêtre d'exécution.

j'espère que ca t'aide.
 
1er
OP
AcidBird

AcidBird

Elite
Quelques remarques :

Tout d'abord j'utilise la routine que je donne pour lancer un exe via createProcess depuis plus de 2 ans et c'est la première fois que je tombe sur ce genre de problème. J'ai bien évidement essayé de changer la valeur de wShowCmd mais cela ne change rien (et ce n'est pas étonnant, dans 95% des programmes, c'est un process global qui crée ta fenêtre et génére l'équivalent d'un Form.Show donc même en passant sw_hide comme je le fait, la fenêtre s'ouvrira quand même).

J'utilise CreateProcess car il est bcp plus facile de "suivre" la vie du process via l'Id qu'on recoit dans le TProcessInfo (essaye de lancer un prgramme d'install fait par inbstallShield par exemple et d'attendre la fin de son exécution via un shellExecute / winexec ... c'est la galère car ce n'est pas le process créé qu'il faut attendre mais bien un process enfant --> bon courage pour retrouver ce process là :) ).

Ensuite pour le shellExecute, pareil j'ai essayé toutes les valeurs possibles mais rien n'y fait. Par contre pour ce qui est de l'handle à passer, c'est celui d'une fenêtre parent --> même en passant celui de mon application, la fenêtre enfant devrait être créée non ? Et tu passes quel valeurs pour l'handle alors ?
Pour les nil ... ca vient de l'aide : si lpFile est remplit, lpParamtyer devrait être à nul --> je pourrais passer une chaine vide mais ca ne doit rien changer.
(c'est la première fois que j'utilise shellExecute :) )

Enfin je vais essayer de contacter la personne qui a écrit cet exe récalcitrant afin de savoir pourquoi mon code ne marche pas ... je vous tiendrai au courant si j'ai des nouvelles :)
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut