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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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).