Avatar billede cms Nybegynder
25. februar 2001 - 14:55 Der er 6 kommentarer og
1 løsning

Kald og aflæsning af output fra console-app

Hej.

Jeg har en win-app i delphi5. Så har jeg en console-app, som jeg ikke selv har lavet. Jeg vil meget gerne have win-app\'en til at kalde/køre console-app\'en. Det er nemt nok - med ShellExecute fx.
Men jeg vil gerne have win-app\'en til at VENTE på at console-app\'en er færdig med at køre, og derefter aflæse, hvad console-app\'en har puttet ud på skærmen (dvs. at den skal selvfølgelig være skjult ---).

Håber, I kan hjælpe

;o) Cms
Avatar billede runem Nybegynder
26. februar 2001 - 14:48 #1
Hej,

For at vente på noget bruger man en række af funktioner der alle hedder noget med WaitFor...

De funktioner skal alle have et Handle de skal \'vente på\'.

Sådan et handle for du f.eks. fra funktionen CreateProcess, som er den du skal bruge i stedet for ShellExecute.

Outputtet fra console applikationen skal du omdirigere ned i en fil. Det er nemmest hvis du laver en .BAT fil rundt omkring kaldet til dit konsolprogram, f.eks. en der hedder RUNIT.BAT og ser sådan ud:

MitKonsolProgram>output.txt

Dernæst eksekverer du runit.bat og venter på at processen slutter, hvorefter du åbner og læser output.txt. Her er et eksempel:

procedure TForm1.Button1Click(Sender: TObject);
var
  zAppName:array[0..512] of char;
  StartupInfo:TStartupInfo;
  ProcessInfo:TProcessInformation;
  F: TextFile;
  S: string;
begin
  try
    StrPCopy(zAppName, \'d:\\borland\\delphi5\\projects\\runit.bat\');

    FillChar(StartupInfo, Sizeof(StartupInfo), #0);
    StartupInfo.cb := Sizeof(StartupInfo);
    StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
    StartupInfo.wShowWindow := SW_HIDE;

    Win32Check(CreateProcess(zAppName,
      nil,
      nil,
      nil,
      False,
      CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
      nil,
      nil,
      StartupInfo,
      ProcessInfo));

    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);

    AssignFile(F, \'d:\\borland\\delphi5\\projects\\test.txt\');
    Reset(F);
    Readln(F, S);
    CloseFile(F);

    ShowMessage(S);

  except
    on E:EWin32Error do
      ShowMessage(E.Message);
  end;

Håber det hjælper

Rune
Avatar billede cms Nybegynder
26. februar 2001 - 21:56 #2
det virker meget fint, tak.

bortset når jeg så rent faktisk kalder console-app\'en (eller hvad det nu hedder) fra bat-filen. Så bliver den nemlig meget langsom - tager ca. 5 sekunder, hvor det burde tage et kvart.

Hvorfor? For når jeg kører bat-filen fra en dos-prompt går det lynende stærkt?
- giver i øvrigt samme hastighedsproblem hvis jeg kalder andre consoles fra bat-filen.

What\'s \'rong ? (flere point er i orden)
Avatar billede cms Nybegynder
26. februar 2001 - 22:00 #3
min første sætning lød vist lidt negativ - det var ikke meningen
Avatar billede cms Nybegynder
26. februar 2001 - 22:04 #4
det skal også lige tilføjes, at når bat-filen er helt tom, så går det også lynende hurtigt.

det er, som om, at et kald af en .exe, i en .bat, kaldet fra en .win-exe (min tilføjelse) ikke virker, mens stort set alle andre kombinationer virker.

aaarghl! hjælp please.
Avatar billede runem Nybegynder
26. februar 2001 - 22:37 #5
Hmm, prøv at ændre NORMAL_PRIORITY_CLASS til HIGH_PRIORITY_CLASS. Jeg ved ikke om det giver noget.

>det skal også lige tilføjes, at når bat-filen er >helt tom, så går det også lynende hurtigt.

Aha :0)

Avatar billede cms Nybegynder
27. februar 2001 - 09:00 #6
har allerede prøvet at ændre til HIGH_PRIORITY_CLASS - det virker desværre ikke
Avatar billede cms Nybegynder
03. marts 2001 - 13:27 #7
jeg stiller et nyt spørgsmål til det sidste.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester