problème de violation d'accès avec createprocess
Salut à tous,
Je tente de faire fonctionner un bout de code sous D2010, mais je n'y arrive pas. Le but est de lancer un exécutable externe avec récupération, au moins, du code retour.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| Function RunWithExitCode ( CommandLine : String ) : LongWord ;
var
PipeIn : THandle;
PiPeOut : THandle;
Security : TSecurityAttributes;
StartupInfo : TStartupInfo;
ProcessInfo : TProcessInformation;
Buffer:array[0..4096] of Char;
NbRead:DWORD;
txt:Tstrings;
cmd:string;
begin
cmd := commandline;
With Security do begin
nlength := SizeOf(TSecurityAttributes) ;
binherithandle := true;
lpsecuritydescriptor := nil;
end;
CreatePipe(PipeIn,PiPeOut,@Security,0);
FillChar(StartupInfo, SizeOf(TStartupInfo),0);
StartupInfo.cb := SizeOf(TStartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
StartupInfo.wShowWindow := SW_SHOW;
StartupInfo.hStdInput := PipeIn;
StartupInfo.hStdOutput:= PiPeOut;
StartupInfo.hStdError := PiPeOut;
CreateProcess(nil,PChar(cmd),nil,nil,false,0,nil,nil,StartupInfo,ProcessInfo);
WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
CloseHandle(PiPeOut);
while ReadFile(PipeIn,Buffer,4096,NbRead,nil) do txt.Add(Buffer);
CloseHandle(PipeIn);
End; |
Je me mange systématiquement une exception de violation d’accès à l’exécution de CreateProcess
Citation:
Violation d'accès à l'adresse 7784B733 dans le module 'kernel32.dll'. Ecriture de l'adresse 004F03BC
Je n'arrive pas à comprendre d'où ça vient.
J'ai pourtant l'habitude (mais pas en Delphi) d'utiliser CreateProcess, j'ai pas souvenir d'avoir déjà buter sur ce problème.
j'avais aussi testé ce code, mais c'est identique
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| Var
StartupInfo : TStartupInfo;
ProcessInfo : TProcessInformation;
Begin
FillChar(StartupInfo,SizeOf(StartupInfo),#0);
StartupInfo.cb := SizeOf(StartupInfo);
StartupInfo.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
If Not CreateProcess( nil, PChar(CommandLine), nil, nil, True, 0, Nil, Nil, StartupInfo, ProcessInfo) Then
RaiseLastOSError;
// Attente de la fin du processus.
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
// Récupération du code de sortie.
GetExitCodeProcess(ProcessInfo.hProcess,Result); |
L'appel :
Code:
1 2
| cmd := 'C:\Windows\notepad.exe';
memo1.Lines.Append(IntToStr(runwithexitcode(cmd))); |
Notepad n'est qu'un exemple. Le logiciel devra fonctionner aussi bien sur plateforme 32 bits que 64 bits, et lancer aussi bien des applications 32 que 64 bits (notamment le gbak et gfix de firebird).