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.
Je me mange systématiquement une exception de violation d’accès à l’exécution de CreateProcess
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 n'arrive pas à comprendre d'où ça vient.Violation d'accès à l'adresse 7784B733 dans le module 'kernel32.dll'. Ecriture de l'adresse 004F03BC
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 :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).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 cmd := 'C:\Windows\notepad.exe'; memo1.Lines.Append(IntToStr(runwithexitcode(cmd)));
Partager