Toon posts:

Return value van external command line application

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben al een hele poos opzoek naar een oplossing om een return value van een external command line application op te vangen in mijn delphi application.

Ik gebruik ShellExecuteEx om het externe programmatje te starten, wanneer het programma succesvol verloopt returnt het een 0 als er fouten optreden wordt -1 teruggegeven. Alleen krijg ik nergens gevonden hoe ik deze return value kan afvangen. Het enige wat ik tegen kom is een return value van de ShellExecute zelf en niet van het programma wat daarmee wordt gerunt.

Mijn code die ik op dit moment gebruik:
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
34
35
var
  SEInfo: TShellExecuteInfo; //contains the info of the shellexecute api
  ExitCode: DWORD;
  execFile, params, dir : String;
  resultCode : Integer;
begin
  execFile := 'testapp.exe';
  params := '--direction ' + way + ' --device ' + device + ' --data-file ' +
  xmlfile + ' --config-file testconfig..xml';
  dir := 'externalSoftware/';

  // Setup the ShellExecute info
  FillChar(SEInfo, SizeOf(SEInfo), 0) ;
  SEInfo.cbSize := SizeOf(TShellExecuteInfo);
  with SEInfo do
  begin
    fMask := SEE_MASK_NOCLOSEPROCESS;
    Wnd := Application.Handle;
    lpFile := PChar(ExecFile);
    lpParameters := PChar(params);
    lpDirectory := PChar(dir);
    nShow := SW_HIDE;
  end;

  // Start the shell executen and wait for it to finish
  if(ShellExecuteEx(@SEInfo)) then
  begin
    repeat
      Application.ProcessMessages;
      GetExitCodeProcess(SEInfo.hProcess, ExitCode);
    until(ExitCode <> STILL_ACTIVE) or Application.Terminated;
          result := True
  end
  else
    result := False;


Heeft iemand enig idee of ervaring met dit probleem?

Alvast enorm bedankt!

Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Je programma werkt al, alleen krijg je blijkbaar niet de waarde die je verwacht. GetExitCodeProcess() geeft in ExitCode de daadwerkelijke waarde terug. Ik snap alleen niet wat "until Application.Terminated" zou moeten doen. Welke application denk je dat 'Application" is?

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
GetExitCodeProcess geeft dus juist de return value van ShellExecuteEx terug. niet van de applicatie die daardoor gestart is. En ik ben er niet in geinteresseerd of shellexecuteex goed verloopt, ik wil weten wat de externe applicatie opleverd..

Acties:
  • 0 Henk 'm!

  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Ik heb zelf geen ervaring met ShellExecute te gebruiken hiervoor maar gebruikte hier CreateProcess() voor.

Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Verwijderd schreef op dinsdag 17 februari 2009 @ 10:08:
GetExitCodeProcess geeft dus juist de return value van ShellExecuteEx terug. niet van de applicatie die daardoor gestart is. En ik ben er niet in geinteresseerd of shellexecuteex goed verloopt, ik wil weten wat de externe applicatie opleverd..
Nee - de return value van ShellExecuteEx is de waarde van x, na het statement x=ShellExecuteEx(argumenten);

Ik vermoed dat je niet bekend met de gebruikelijke terminologie. Wat wil je nu eigenlijk hebben?

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Je hebt gelijk, jammer alleen dat je zo reageerd. Een mens kan nou eenmaal fouten maken..

ik heb het uiteindelijk zo opgelost:
code:
1
2
3
4
5
6
7
8
9
repeat
  Application.ProcessMessages;
  GetExitCodeProcess(SEInfo.hProcess, ExitCode);
until(ExitCode <> STILL_ACTIVE);
  if(ExitCode = 0) then;
    result := True;
  end
    else
      result := False;

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je kunt beter MsgWaitForMultipleObjects() gebruiken - nu zal je loop altijd 100% CPU-tijd gebruiken. Maar een process handle is ook een waitable object - als je daarop een van de wait functies aanroept dan wacht ie tot het proces is afgesloten. Vervolgens gebruik je dan natuurlijk MsgWaitForMultipleObjects ipv WaitForSingleObject omdat je ook nog messages wil processen en niet alleen op het proces wilt wachten.

Dat wordt dan zoiets (let wel, ik ben geen Delphi expert)
Delphi:
1
2
3
4
repeat
  Application.ProcessMessages;
until(MsgWaitForMultipleObjects(1, @SEInfo.hProcess, TRUE, INFINITE, QS_ALLEVENTS) <> WAIT_OBJECT_0);
GetExitCodeProcess(SEInfo.hProcess, ExitCode);

[ Voor 25% gewijzigd door .oisyn op 17-02-2009 12:14 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1