TProcess auf Win32 [gelöst]

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Cybermonkey342
Beiträge: 109
Registriert: Sa 1. Mär 2008, 15:19
OS, Lazarus, FPC: openSUSE Leap 15.6 (FPC 3.2.2) / Windows 11 Pro (FPC 3.2.2)
CPU-Target: x64
Kontaktdaten:

TProcess auf Win32 [gelöst]

Beitrag von Cybermonkey342 »

Hallo, ich habe ein kleines Problem damit, auf Windows Dinge von der Konsole auszulesen. Unter Linux funktioniert alles einwandfrei, aber Windows macht da Mucken. Zunächst hatte ich eine einfache Version laufen, die auf das Ende des Prozesses wartet. Dann habe ich eine erweiterte Version probiert (ich gebe nicht das ganze Programm an, das ist vom Freepascal Wiki):

Code: Alles auswählen

P := TProcess.Create(nil);
   P.CommandLine := 'clscript.exe';
   P.Options := P.Options+ [poUsePipes]-[poWaitOnExit];
   WriteLn('-- executing --');
   P.Execute;
   while P.Running do
   begin          
     // stellt sicher daß wir Platz haben
     M.SetSize(BytesRead + READ_BYTES);
 
     // versuche es zu lesen
     n := P.Output.Read((M.Memory + BytesRead)^, READ_BYTES);
     if n > 0 
     then begin
       Inc(BytesRead, n);
       Write('.')
     end
     else begin     
       // keine Daten, warte 100 ms
       Sleep(100); 
     end;
   end;
   // lese den letzten Teil
   repeat
     // stellt sicher daß wir Platz haben
     M.SetSize(BytesRead + READ_BYTES);
     // versuche es zu lesen
     n := P.Output.Read((M.Memory + BytesRead)^, READ_BYTES);
     if n > 0 
     then begin
       Inc(BytesRead, n);
       Write('.');
     end;
   until n <= 0;
   if BytesRead > 0 then WriteLn;
   M.SetSize(BytesRead); 
   WriteLn('-- executed --');
 
   S := TStringList.Create;
   S.LoadFromStream(M);
   WriteLn('-- linecount = ', S.Count, ' --');
   for n := 0 to S.Count - 1 do
   begin
     WriteLn('| ', S[n]);
   end;
   WriteLn('-- end --');
Wie man sieht starte ich meinen Script Interpreter CLScript ohne Parameter, dann müsste eigentlich Folgendes zu sehen sein:
CLScript interpreter 1.0
Usage: clscript[.exe] script.lua
Kommt aber nur:
-- executing --
-- executed --
-- linecount = 0 --
-- end --
Jetzt kommt aber der Clou: wenn ich ein anderes Programm starte, dass nicht von FPC kompiliert wurde, also nicht writeln() für die Konsole benutzt, dann geht es. Starte ich z. B. ein Lua Script, dass dann mit dem Lua-eigenen print was ausgibt, also print ("Hello World"), dann wird mir das Hello World angezeigt, aber nichts, was mit writeln ausgegeben wurde. Und das wie gesagt, nur unter Windows.
Hat da jemand Erfahrung damit? Ist das ein Bug in writeln(), oder bin ich nur zu blöd?
Zuletzt geändert von Cybermonkey342 am Di 7. Sep 2010, 14:47, insgesamt 1-mal geändert.
Mit besten Grüßen,
Cybermonkey

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TProcess auf Win32

Beitrag von Socke »

Windows-GUI-Anwendungen besitzen keine StdOut/-In/-Err (write(ln) schreibt standardmäßig auf StdOut). Wenn du sie unter Windows trotzdem nutzen möchtest, musst du im Programm {$APPTYPE CONSOLE} oder den Kompilerschalter "-WG" nicht benutzen (er ist in Lazarus standardmäßig gesetzt, siehe: Projekt->Projekteinstellungen->Compilereinstellungen/Linken->Win32-GUI-Anwendung).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Cybermonkey342
Beiträge: 109
Registriert: Sa 1. Mär 2008, 15:19
OS, Lazarus, FPC: openSUSE Leap 15.6 (FPC 3.2.2) / Windows 11 Pro (FPC 3.2.2)
CPU-Target: x64
Kontaktdaten:

Re: TProcess auf Win32

Beitrag von Cybermonkey342 »

Ich habe CLScript ja mit {$apptype console} kompiliert ... (alles rein Freepascal, kein Lazarus).
Mit besten Grüßen,
Cybermonkey

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: TProcess auf Win32

Beitrag von carli »

Nimm mal das poWaitOnExit wieder rein (oder rufe WaitOnExit irgendwann auf).
Sonst lässt du das Programm ja nicht bis zu Ende laufen.

Cybermonkey342
Beiträge: 109
Registriert: Sa 1. Mär 2008, 15:19
OS, Lazarus, FPC: openSUSE Leap 15.6 (FPC 3.2.2) / Windows 11 Pro (FPC 3.2.2)
CPU-Target: x64
Kontaktdaten:

Re: TProcess auf Win32

Beitrag von Cybermonkey342 »

Sorry, habe oben mich etwas missverständlich ausgedrückt. Nochnmal kurz: wenn ich das Programm über die Konsole ausführe, erhalte ich natürlich eine Ausgabe, nur wenn ich es als TProcess ausführe nicht.
Wenn ich allerdings, sagen wir mal 'dir.exe' ausführe, dann habe ich auch als TProcess eine Ausgabe.

Habe poWaitOnExit reingemacht, geht aber auch nicht... (Natürlich geht es mit jedem Programm,z. B. 'dir.exe', außer wenn Pascal Programme ausgeführt werden...) Kann das auch an Windows Vista liegen?
Nicht mal das geht: (außer ich starte es direkt natürlich, dann kommt die Ausgabe, aber nicht als TProcess ...)

Code: Alles auswählen

{$apptype console}
program Helloworld;
 
uses crt;
 
BEGIN
writeln ('Hello World');	
END.
Microsoft Windows [Version 6.0.6002]
Copyright (c) 2006 Microsoft Corporation. Alle Rechte vorbehalten.

C:\Users\markus>cd clscript

C:\Users\markus\clscript>hello.exe
Hello World

C:\Users\markus\clscript>commandline.exe
-- executing --
-- executed --
-- linecount = 0 --
-- end --

C:\Users\markus\clscript>
Mit besten Grüßen,
Cybermonkey

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: TProcess auf Win32

Beitrag von carli »

Eventuell sogar das selbe Problem wie bei mir:

Führe mal im Zielprogramm (welches du mit Pascal geschrieben hast) folgende Zeile nach jeder Ausgabe aus:

Code: Alles auswählen

Flush(StdOut);
Damit stellst du sicher, dass auch die Zeilen durchkommen.
Das Zielprogramm sollet natürlich als APPTYPE console kompiliert sein.

Cybermonkey342
Beiträge: 109
Registriert: Sa 1. Mär 2008, 15:19
OS, Lazarus, FPC: openSUSE Leap 15.6 (FPC 3.2.2) / Windows 11 Pro (FPC 3.2.2)
CPU-Target: x64
Kontaktdaten:

Re: TProcess auf Win32

Beitrag von Cybermonkey342 »

Ist das Zielprogramm jetzt das Programm, das den Prozess ausführt, oder das Programm, das der Prozess ist?
Habe jedenfalls beide Programme mit apptype console kompiliert und bei beiden nach jedem Write bzw. Writeln ein Flush (StdOut); eingefügt. Leider geht es immer noch nicht ...

Okay, durch Probieren weiß ich, dass ich kein FLush in das aufrufende Programm einfügen darf. Z. B. geht dann "dir" nicht mehr ...
Spaßeshalber habe ich das probiert:

Code: Alles auswählen

#include <stdio.h>
 
int main(int argc, char** argv)
{
	printf ("Hello World\n");
	return 0;
}
Das C-Programm geht, das Pascal Programm nicht ...
Mit besten Grüßen,
Cybermonkey

Cybermonkey342
Beiträge: 109
Registriert: Sa 1. Mär 2008, 15:19
OS, Lazarus, FPC: openSUSE Leap 15.6 (FPC 3.2.2) / Windows 11 Pro (FPC 3.2.2)
CPU-Target: x64
Kontaktdaten:

Re: TProcess auf Win32

Beitrag von Cybermonkey342 »

Ok, habe die Lösung aus dem engl. Forum. Es muss

Code: Alles auswählen

uses crt;
bzw. eben nur crt, wenn man andere units benutzt, weggelassen werden.

P.S. Kann man einen Thread als "gelöst" markieren?
Mit besten Grüßen,
Cybermonkey

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6811
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TProcess auf Win32

Beitrag von af0815 »

Cybermonkey342 hat geschrieben:P.S. Kann man einen Thread als "gelöst" markieren?
Zum ersten Beitrag gehen und dort die Überschrift ändern.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten