Wie genau rufe ich ein anderes Programm auf (Windows) und werte den Output aus?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
alfware17
Beiträge: 134
Registriert: Di 14. Dez 2010, 23:27

Wie genau rufe ich ein anderes Programm auf (Windows) und werte den Output aus?

Beitrag von alfware17 »

Hallo zusammen,

ich habe ein kleines Start-Stop Programm geschrieben (Quellen siehe anbei, Laufzeit und die beiden abhängigen Units).

Nun kam ich auf die Idee, ich könnte meine "Nutz"-Prozedur, die erstmal nur Schleife heißt, wo aber natürlich noch Inhalt rein soll (den habe ich schon, ich möchte ein anderes Programm Laufzeit testen, welches hier erstmal nicht wichtig ist), in ein externes Programm auszulagern (Schleife wäre dann das externe Programm).

Okay ich habe gegoogelt und eine Lösung über APROCESS gefunden. Sicher ist das für die Profis unter Euch zu primitiv, aber mir würde es reichen, wenn es funktioniert. Aufruf mit Parametern und ggf. Output auswerten (ist Luxus bei dem Problem, aber vielleicht mal später). Nun habe ich mehrere Fragen bzw Probleme, die ich als Anfänger nicht lösen kann.
Ich wollte aber noch dazu sagen, die Aufruf-Logik ist hier noch umgekehrt, d.h LAUNCH (auch im Anhang) ruft noch LAUFZEIT auf, irgendwann später soll das mal anders herum.

Meine Fragen:
1.was soll mir das Compiler-Warning bezüglich der Commandline (depricated) sagen bzw wie löse ich es moderner?

2.wo ist mein Output (des LAUFZEIT Programms)? Rufe ich nur dieses auf, schreibt es per Writeln in die Standardausgabe. Aber die heißt doch OUTPUT oder?
Ich sehe leider weder etwas im DOS-Fenster (Aufrufzeile) noch in der Datei output.txt (0 Bytes, leer)

3.wenn aus 1. folgt, daß ich etwas modernisieren muß, wo finde ich da etwas dazu (LAUNCH ist ein gegoogeltes Beispiel, die anderen 3 habe ich selbst geschrieben bzw sind uralt)

Wichtig wäre mir, daß das Ganze unter FPC funktioniert und in Windows 7 (32bit, XP wäre Luxus aber schön) wie auch in Windows 11 (64bit) und auch möglichst in Linux (Mint 19. 32 bzw 64bit) und zwar ohne Lazarus, ich programmiere noch fast ausschließlich Konsolen-Programme.

Danke für Eure Tips
Dateianhänge
Laufzeit.zip
(10.84 KiB) 62-mal heruntergeladen

shokwave
Beiträge: 470
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Wie genau rufe ich ein anderes Programm auf (Windows) und werte den Output aus?

Beitrag von shokwave »

Hallo,

zu deiner 1. Frage: Das wird über TProcess.Executable und TProcess.Parameters.Add gelöst und würde in deinem Programm so aussehen.

Code: Alles auswählen

  AProcess.Executable := 'laufzeit';
  AProcess.Parameters.Add('0');
  AProcess.Parameters.Add('1');
zu Frage 2: Das funktioniert so nur selten, weshalb auf der englischen Wikiseite bei dem Beispiel steht, dass man es nicht benutzen soll und auf das Beispiel mit dem "großen Output" verweist. Im Prinzip wird dann der Output, während das Programm läuft, ausgelesen und anschließend in die Datei gespeichert. Im Gegensatz zum ersten Beispiel, wo der Output erst nach dem Ende des externen Programms ausgelesen wird. Übertagen auf dein Programm wäre das ungefähr so.

Code: Alles auswählen

const
  READ_BYTES = 2048;
var
  AProcess: TProcess;
  AStringList: TStringList;
  AMemoryStream: TMemoryStream;
  n: longint;
  BytesRead: longint;
begin
  AMemoryStream := TMemoryStream.Create;
  BytesRead := 0;

  AProcess := TProcess.Create(nil);
  AProcess.Executable := 'laufzeit';
  AProcess.Parameters.Add('0');
  AProcess.Parameters.Add('1');
  AProcess.Options := [poUsePipes];
  AProcess.Execute;

  while AProcess.Running do
  begin
    AMemoryStream.SetSize(BytesRead + READ_BYTES);
    n := AProcess.Output.Read((AMemoryStream.Memory + BytesRead)^, READ_BYTES);
    if n > 0 then
    begin
      Inc(BytesRead, n);
    end
    else
    begin
      Sleep(100);
    end;
  end;

  repeat
    AMemoryStream.SetSize(BytesRead + READ_BYTES);
    n := AProcess.Output.Read((AMemoryStream.Memory + BytesRead)^, READ_BYTES);
    if n > 0 then
    begin
      Inc(BytesRead, n);
    end;
  until n <= 0;

  AMemoryStream.SetSize(BytesRead);
  AStringList := TStringList.Create;
  AStringList.LoadFromStream(AMemoryStream);
  AStringList.SaveToFile('output.txt');

  AStringList.Free;
  AMemoryStream.Free;
  FreeAndNil(AProcess);
end.
zur 3. Frage: https://wiki.freepascal.org/Executing_E ... rge_output Die englische Version ist hier aktueller, auch bei den Beispielen. Weshalb es sich lohnt da einen Blick rein zu werfen, auch wenn man kein englisch spricht.

Die Codebeispiele habe ich jetzt nicht getestet, können also noch Fehler enthalten.

Ich hoffe das hilft dir weiter!
mfg Ingo

shokwave
Beiträge: 470
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Wie genau rufe ich ein anderes Programm auf (Windows) und werte den Output aus?

Beitrag von shokwave »

Nachtrag: Ich konnte es jetzt testen, aber irgendwie funktioniert das mit deinem "laufzeit"- Programm nicht.
Wenn ich als Executeable "fpc" und als Parameter "-iV" benutze, erhalte ich das gewünschte Ergebnis in der output.txt.

Da bin ich jetzt überfragt, warum es bei deinem Programm nicht klappt.
mfg Ingo

shokwave
Beiträge: 470
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Wie genau rufe ich ein anderes Programm auf (Windows) und werte den Output aus?

Beitrag von shokwave »

Nach einigen Versuchen, konnte ich das Problem beim "ClrScr"-Aufruf im "laufzeit"-Programm finden. Wenn du den weglässt, landet die Ausgabe in der output.txt.

Nachtrag: Das Problem scheint die CRT-Unit an sich zu sein. Sobald diese eingebunden ist, erhalte ich keinen output. Wenn ich die entferne und Sleep (aus der Unit SysUtils) statt delay verwende geht es.
mfg Ingo

alfware17
Beiträge: 134
Registriert: Di 14. Dez 2010, 23:27

Re: Wie genau rufe ich ein anderes Programm auf (Windows) und werte den Output aus?

Beitrag von alfware17 »

Hallo und vielen herzlichen Dank für deine schnelle und vollständige Antwort. Das läuft bei mir und ich bin zufrieden...

Die CRT brauche ich natürlich nicht wirklich, die hatte sich nur so in das LAUFZEIT reingeschummelt durch ein Copy+Paste von einem älteren Turbo-Pascal von mir.
Da ich möglichst Win16/32/64 und Linux machen will, muß ich darauf verzichten, es ist auch der Hauptgrund damals für die STDIO Unit gewesen (Ersatz des keypressed)

Eine Frage habe ich aber doch zu Deinem Code. Die While-Schleife, die Du zusätzlich zu dem Wiki-Beispiel drin hast, die war nur zum Testen oder?
Ich habe sie mal weggelassen (auskommentiert), weil mir das fast identisch zum Repeat aussieht und LAUNCH2 läuft immer noch... :D
Oder gab es einen Grund, den ich nicht sehe?

Code: Alles auswählen

uses Classes, SysUtils, Process;

const
   READ_BYTES = 2048;
var
   AProcess: TProcess;
   AStringList: TStringList;
   AMemoryStream: TMemoryStream;
   n: longint;
   BytesRead: longint;
begin
   AMemoryStream := TMemoryStream.Create;
   BytesRead := 0;

   AProcess := TProcess.Create(nil);
   AProcess.Executable := 'laufzeit';
   AProcess.Parameters.Add('0');
   AProcess.Parameters.Add('1');
   AProcess.Options := [poUsePipes];
   AProcess.Execute;

  (* 
   while AProcess.Running do begin
      AMemoryStream.SetSize(BytesRead + READ_BYTES);
      n := AProcess.Output.Read((AMemoryStream.Memory + BytesRead)^, READ_BYTES);
      if n > 0 
         then Inc(BytesRead, n)
         else Sleep(100);
   end;
  *)

   repeat
      AMemoryStream.SetSize(BytesRead + READ_BYTES);
      n := AProcess.Output.Read((AMemoryStream.Memory + BytesRead)^, READ_BYTES);
      if n > 0 
         then Inc(BytesRead, n);
   until n <= 0;

   AMemoryStream.SetSize(BytesRead);
   AStringList := TStringList.Create;
   AStringList.LoadFromStream(AMemoryStream);
   AStringList.SaveToFile('output2.txt');

   AStringList.Free;
   AMemoryStream.Free;
   FreeAndNil(AProcess);
end.

shokwave
Beiträge: 470
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Wie genau rufe ich ein anderes Programm auf (Windows) und werte den Output aus?

Beitrag von shokwave »

Hallo,

der Code ist identisch zu dem aus der deutschen Wikiseite (ohne die Kommentare und writeln()). Das Beispiel auf der englischen Seite verzichtet tatsächlich darauf. Die Idee der while-Schleife war, den output des laufenden Programms zu lesen und die repeat-Schleife, sollte den Rest holen, wenn das Programm beendet ist. Wenn ich so drüber nachdenke, sollte die repeat-Schleife tatsächlich reichen, da sie ja auch läuft, während das Programm läuft...

Ich hatte mir die Seite gestern nicht genauer angesehen, sonder nur grob überflogen, da ich noch wusste wo ich was zu dem Thema gefunden hatte, was mir half.
Funktionieren sollten aber beide Varianten, wobei eine Schleife natürlich übersichtlicher ist.
mfg Ingo

TBug
Beiträge: 177
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: Wie genau rufe ich ein anderes Programm auf (Windows) und werte den Output aus?

Beitrag von TBug »

Hallo,
shokwave hat geschrieben:
Mi 10. Aug 2022, 10:37
Wenn ich so drüber nachdenke, sollte die repeat-Schleife tatsächlich reichen, da sie ja auch läuft, während das Programm läuft...
Die repeat-Schleife würde aber nur so lange laufen, wie momentan auch noch Daten zum Lesen vorhanden sind.

Wenn jetzt aber das externe Programm für 30 Sekunden keine Daten schreibt,, dann aber wieder, dann würden diese nicht mehr gelesen werden, weil die Repeat-Schleife ja nicht kontrolliert, ob das Programm noch läuft und deshalb der Vorgang schau beendet wäre.
.

alfware17
Beiträge: 134
Registriert: Di 14. Dez 2010, 23:27

Re: Wie genau rufe ich ein anderes Programm auf (Windows) und werte den Output aus?

Beitrag von alfware17 »

Ich danke euch auch noch für diese Erklärung. Ich habe es ausprobiert, welche Schleife bevorzugt wird.
Überraschung: entweder nur die While (wenn nicht auskommentiert) oder sonst das Repeat mit identischen Bytewerten (ich nehme an, der Puffer wird durch 1-3 Zeilen gefüllt).

Code: Alles auswählen

uses Classes, SysUtils, Process;

const
   READ_BYTES = 2048;
var
   AProcess: TProcess;
   AStringList: TStringList;
   AMemoryStream: TMemoryStream;
   n: longint;
   BytesRead: longint;
begin
   AMemoryStream := TMemoryStream.Create;
   BytesRead := 0;

   AProcess := TProcess.Create(nil);
   AProcess.Executable := 'laufzeit';
   AProcess.Parameters.Add('0');
   AProcess.Parameters.Add('1');
   AProcess.Options := [poUsePipes];

   Writeln('Start AProcess.Execute');

   AProcess.Execute;

   {while AProcess.Running do begin
      AMemoryStream.SetSize(BytesRead + READ_BYTES);
      n := AProcess.Output.Read((AMemoryStream.Memory + BytesRead)^, READ_BYTES);
      if n > 0
         then begin Writeln('-while- BytesRead=',BytesRead,' neu=', n); Inc(BytesRead, n); end
         else Sleep(100);
   end;
   }
   Writeln('While beendet, starte Repeat');

   repeat
      AMemoryStream.SetSize(BytesRead + READ_BYTES);
      n := AProcess.Output.Read((AMemoryStream.Memory + BytesRead)^, READ_BYTES);
      if n > 0
         then begin Writeln('-repeat- BytesRead=',BytesRead,' neu=', n); Inc(BytesRead, n); end
   until n <= 0;

   Writeln('Repeat beendet, BytesRead=', BytesRead);

   AMemoryStream.SetSize(BytesRead);
   AStringList := TStringList.Create;
   AStringList.LoadFromStream(AMemoryStream);
   AStringList.SaveToFile('output.txt');

   AStringList.Free;
   AMemoryStream.Free;
   FreeAndNil(AProcess);
end.
Ergo, ich lasse beides drin, While und Repeat, ist ja nicht schlimm. Mal sehen ob ich mal ein etwas länger laufendes Programm checken kann, ob noch in beiden Schleifen etwas geschrieben wird.

Danke für das lehrreiche Beispiel

alfware17
Beiträge: 134
Registriert: Di 14. Dez 2010, 23:27

Re: Wie genau rufe ich ein anderes Programm auf (Windows) und werte den Output aus?

Beitrag von alfware17 »

TBug hat geschrieben:
Mi 10. Aug 2022, 13:41
Hallo,
shokwave hat geschrieben:
Mi 10. Aug 2022, 10:37
Wenn ich so drüber nachdenke, sollte die repeat-Schleife tatsächlich reichen, da sie ja auch läuft, während das Programm läuft...
Die repeat-Schleife würde aber nur so lange laufen, wie momentan auch noch Daten zum Lesen vorhanden sind.

Wenn jetzt aber das externe Programm für 30 Sekunden keine Daten schreibt,, dann aber wieder, dann würden diese nicht mehr gelesen werden, weil die Repeat-Schleife ja nicht kontrolliert, ob das Programm noch läuft und deshalb der Vorgang schau beendet wäre.
.
@TBug

Ist denn nicht vor dem Repeat das aufgerufene Programm beendet und kann nicht mehr schreiben? Oder verstehe ich das mit dem asynchron/synchron immer noch nicht. Okay mein aufgerufenes Programm ist jetzt kurz und sofort beendet, ich könnte aber ein längeres nehmen oder den Sekundenwert mal erhöhen

TBug
Beiträge: 177
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: Wie genau rufe ich ein anderes Programm auf (Windows) und werte den Output aus?

Beitrag von TBug »

Hallo alfware17,
alfware17 hat geschrieben:
Mi 10. Aug 2022, 17:41
Ist denn nicht vor dem Repeat das aufgerufene Programm beendet und kann nicht mehr schreiben?
Wenn die While-Schleife drin ist, dann ist das Programm vor dem repeat schon beendet, aber es kann ja dort schon bereits mehr Byte geschrieben haben, als bereits gelesen wurden.
alfware17 hat geschrieben:
Mi 10. Aug 2022, 17:41
ich könnte aber ein längeres nehmen oder den Sekundenwert mal erhöhen
Schreibe einmal das zu überwachende Programm "laufzeit" so:

Code: Alles auswählen

//Programm Start
for i := 1 to 4 do
   begin
     Writeln(IntToStr(i) + "=" + "Text  mit ca.  3000Byte....");
     Sleep(30000);   //30 Sekunden warten
   end;
Writeln("5 = " + "Text  mit ca.  3000Byte....");
//Programm Ende
Die Schreibvorgänge 1-4 des Programms "laufzeit" in der for-Schleife müsstest Du jetzt in der while-Schleife des Kontrollprogramms "sehen".

Beim Schreibvorgang 5 kommt es jetzt darauf an.
Es kann sein, dass die ersten 2048 Byte noch in der while-Schleife ausgelesen werden und der Rest in der repeat-Schleife. Oder aber alles in der while oder aber repeat-Schleife

Dies ist abhängig von der Rechnergeschwindigkeit / Aufteilung der Prozesse / usw...
.

alfware17
Beiträge: 134
Registriert: Di 14. Dez 2010, 23:27

Re: Wie genau rufe ich ein anderes Programm auf (Windows) und werte den Output aus?

Beitrag von alfware17 »

Das habe ich gerade getestet und nun nach mehreren Versuchen (andere Länge des Text, mehrmals laufen lassen) endlich einen Lauf dabei, wo sowohl im while als auch im repeat noch Output-Daten gesammelt wurden

Code: Alles auswählen

Start AProcess.Execute
-while- BytesRead=63 neu=63
-while- BytesRead=237 neu=174
-while- BytesRead=493 neu=256
-while- BytesRead=1773 neu=1280
-while- BytesRead=3053 neu=1280
-while- BytesRead=3244 neu=191
-while- BytesRead=3500 neu=256
-while- BytesRead=4780 neu=1280
-while- BytesRead=6060 neu=1280
-while- BytesRead=6251 neu=191
-while- BytesRead=6507 neu=256
-while- BytesRead=7787 neu=1280
-while- BytesRead=9067 neu=1280
-while- BytesRead=9258 neu=191
-while- BytesRead=9514 neu=256
-while- BytesRead=10794 neu=1280
-while- BytesRead=12074 neu=1280
-while- BytesRead=12265 neu=191
-while- BytesRead=12521 neu=256
-while- BytesRead=13801 neu=1280
-while- BytesRead=15081 neu=1280
While beendet, starte Repeat
-repeat- BytesRead=15337 neu=256
Repeat beendet, BytesRead=15337
Mein Laufzeit3 Programm sieht nun so aus

Code: Alles auswählen

program LaufZeit;
{$DEFINE DisableUTF8RTL}
{ $DEFINE DOS}
{ $DEFINE X86_64}
{ $DEFINE LINUX_32}
{ $DEFINE LINUX_64}
{$IFDEF LINUX_32} {$DEFINE LINUX} {$ENDIF}
{$IFDEF LINUX_64} {$DEFINE LINUX} {$ENDIF}
{$IFNDEF LINUX} {$IFNDEF DOS} {$DEFINE WIN_3264} {$ENDIF} {$ENDIF}

{$IFDEF DOS} {$M 65520,0,655360} {$N+}
{$ELSE} {$mode objfpc} {$H-}
        {$IFDEF X86_64} {$MAXSTACKSIZE $7FFFFFF} {$ENDIF}
{$ENDIF}

USES SysUtils, Stdio, Zeit;

CONST VERSION_INFO = 'Laufzeit   V 1.00 ' +
{$IFDEF LINUX_32} '(Linux 32)' {$ELSE} {$IFDEF LINUX_64} '(Linux 64)' {$ELSE}
{$IFDEF DOS}      '(16bit)' {$ELSE}
{$IFDEF X86_64}   '(64bit)' {$ELSE} '(32bit)' {$ENDIF} {$ENDIF} {$ENDIF}
{$ENDIF} + ' 04.08.2022   (c) ALFWARE B.Schubert';

CONST SLASH = {$IFDEF LINUX} '/' {$ELSE} '\' {$ENDIF} ;

VAR LG, LH, LM, LS, LMS: LONGINT;
    W: WORD;
    Text3001: AnsiString;

procedure Program_Start;
var i:integer;
begin
   Writeln('Parameterauswertung');
   VAL(Paramstr(1), LMS, W);
   VAL(Paramstr(2), LS, W);
   VAL(Paramstr(3), LM, W);
   VAL(Paramstr(4), LH, W);
   LG:=(((LH * 60) + LM ) * 60 + LS ) * 1000 + LMS;
   Writeln(LH,' h, ', LM,' m, ', LS,' s, ',  LMS,' ms');
   Writeln('Gesamt:', StrLong(LG),' ms');
   Writeln; Writeln(Intervall_Start(1));
   Text3001:='';
   for i:=1 to 3001 do text3001:=text3001 + IntToStr(i mod 10);
end;

procedure Program_Ende;
begin
   Writeln(Intervall_Stop(1));
   Writeln(Intervall_Dauer(1));
end;

procedure Schleife3;
var i:integer;
begin
   for i:=1 to 4 do begin
      Writeln(IntToStr(i) + ' = ' + text3001);
      Sleep(30000);   //30 Sekunden warten
   end;
   Writeln('5 = ' + text3001);
end;

procedure Schleife;
begin
   if LG > 0 then sleep(LG) else sleep(100);
end;

begin
   Writeln(VERSION_INFO);
   Writeln; Writeln('Aufruf LAUFZEIT [MS [S [M [H] ] ] ]');
   Writeln; Writeln('Start-Stop Laufzeit eines Programmes...');
   Program_Start;
   Schleife3;
   Program_Ende;
   Writeln; Writeln('Programmende');
end (* Laufzeit *).
Was mir nicht so ganz einleuchtet, wie die maximale Länge 1280 zustande kommt, aber gut.

Ich kann mit dem Aufruf nun gut arbeiten und mich dem eigentlichen Nutzprogramm, für das Laufzeit ja nur der Rahmen sein soll, widmen.

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Wie genau rufe ich ein anderes Programm auf (Windows) und werte den Output aus?

Beitrag von PascalDragon »

Nur weil ich es gerade sehe: dein $define DisableUTF8RTL hat dort wo es ist genau Null Auswirkung. Das gilt nämlich nur, wenn die LCL kompiliert wird und da musst du das Define in den Einstellungen für die LCL setzen, nicht in deinem Programm.

Und warum hast du die $define Linux und $define x86_64 da drin? FPC definiert LINUX automatisch, wenn für Linux gebaut wird und die Zieltplattform ist über CPUxxx prüfbar (also CPUX86_64 für die x86_64 Platform).
FPC Compiler Entwickler

alfware17
Beiträge: 134
Registriert: Di 14. Dez 2010, 23:27

Re: Wie genau rufe ich ein anderes Programm auf (Windows) und werte den Output aus?

Beitrag von alfware17 »

Zum #Define DisableUTF8RTL - ja da hast du sicher recht, es ist ein Überbleibsel aus meinen Versuchstagen, eine Quelle möglichst für Win16/32/64 und Linux32/64 zu haben und auch mit meinen Daten (Textdateien) klarzukommen. Ich werde es rausnehmen.

Die Schalter für die Plattformen - nunja, ich habe die auch in meinen .bat bzw .sh Scripts mit drin und wahrscheinlich hast du auch recht und ich könnte was weglassen. Ich habe diesen Programmkopf nur meistens überall drin und manchmal brauche ich es gerade dann, wenn ich es gelöscht habe, zB ich brauche genau Linux 32bit oder so. Aber danke dir :D

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Wie genau rufe ich ein anderes Programm auf (Windows) und werte den Output aus?

Beitrag von PascalDragon »

alfware17 hat geschrieben:
Sa 13. Aug 2022, 14:35
Die Schalter für die Plattformen - nunja, ich habe die auch in meinen .bat bzw .sh Scripts mit drin und wahrscheinlich hast du auch recht und ich könnte was weglassen. Ich habe diesen Programmkopf nur meistens überall drin und manchmal brauche ich es gerade dann, wenn ich es gelöscht habe, zB ich brauche genau Linux 32bit oder so. Aber danke dir :D
Da kannst du aber auch einfach auch folgendes machen:

Code: Alles auswählen

{$if defined(LINUX) and defined(CPU32)} // für alle 32-bit Plattformen

{$if defined(LINUX) and defined(CPUI386)} // nur für i386
Du kannst dir damit dann auch dein eigenes Define setzen, so musst du nichts von außen reingeben, wenn der Compiler dir das schon gratis gibt. ;)
FPC Compiler Entwickler

Antworten