ich habe ein Problem beim aufrufen eines externen Programms.
Im Task-Manager kann ich sehen das das Programm aufgerufen wird.
Aber es erfolgt keine Ausgabe die beim Aufruf rigctl.exe -l erfolgen sollte.
Kann es sein das der Parameter -l beim Aufruf verschluckt wird ? D
Hier der komplette Code
Code: Alles auswählen
program qrg;
{$mode objfpc}{$H+}
uses
{$ifdef Unix}
BaseUnix, Classes, sysutils, Process;
{$else}
sysutils, Process,Classes,Windows;
{$endif}
var
Datei: Text; (* Dateizeiger *)
zeile: string; (* *)
trx: string; (* funkgerät *)
speed: string; (* Baudrate für serielle Schnittstelle *)
port: string; (* Serielle schnittstelle *)
Position : integer;(* Position im String *)
PositionA : integer;
PositionB : integer;
parameter: string;
wert: String;
AProcess: TProcess;
AStringList: TStringList;
zeilennr: integer;
befstr: string;
VFOa: string;
VFOb: String;
TRXMode: String;
rigctlpath : string;
begin
// if FileExistsUTF8('c:\Program Files (x86)\hamlib-win32-1.2.15.3\bin\rigctl.exe') then
rigctlpath := 'c:\Program Files (x86)\hamlib-win32-1.2.15.3\bin\';
if FileExists(rigctlpath+'rigctl.exe') then
begin
if not FileExists('qrg.ini') then
begin
//Datei existiert nicht --> erstellen
assignfile(Datei, 'qrg.ini');
rewrite(Datei);
WriteLn (Datei, '#########################################');
WriteLn (Datei, '# Ini Datei für das Programm qrg #');
WriteLn (Datei, '# qrg dient zum wechseln einer Frequenz #');
WriteLn (Datei, '# mittels HamLib bei ein Transceiver #');
WriteLn (Datei, '# (c) by Dirk Unverzagt, DL8AAX #');
WriteLn (Datei, '#########################################');
WriteLn (Datei, '# Serielle Schnittstelle');
WriteLn (Datei, '# port=/dev/ttyUSB0');
WriteLn (Datei, '#port=/dev/ttyS0 ');
WriteLn (Datei, '# für windos');
WriteLn (Datei, 'port=com1 ');
WriteLn (Datei, ' ');
WriteLn (Datei, '# Baudrate');
WriteLn (Datei, 'speed=4800 ');
WriteLn (Datei, ' ');
WriteLn (Datei, '# TRX=Nr. Die Nummer deines TRX ');
WriteLn (Datei, '# Abfragen kannst du die Nr.mir rigctl -l ');
WriteLn (Datei, 'trx=1 ');
WriteLn (Datei, ' ');
WriteLn (Datei, '# Pfad zu rigctl.exe');
WriteLn (Datei, 'rigctlpath=c:"\Program Files (x86)"\hamlib-win32-1.2.15.3\bin\ ');
closefile(Datei);
end
else
begin
// Datei existiert
Assign (Datei, 'qrg.ini'); (* Pfad festlegen *)
Reset (Datei); (* Datei zum Lesen oeffnen *)
REPEAT
ReadLn (Datei, zeile); (* eine Zeile lesen *)
if zeile[1]='#' then // beginnt die Zeile mit ein #
else
begin // nein
//WriteLn (zeile); (* eine Zeile am Bildschirm ausgeben *)
Position := Pos('=', AnsiLowerCase(zeile));
if Position <> 0 then // ein = ist vorhanden also parameter zeile
begin
parameter := Trim(Copy(zeile, 1,Position-1 )); // Text bis zum =
wert := Trim(Copy(zeile, Position+1, Length(zeile))); // Text bis zum =
case LowerCase(parameter) of
'port':
port := wert;
'speed':
speed := wert;
'trx':
trx := wert;
'rigctlpath':
rigctlpath :=wert;
end;
end;
end;
UNTIL EOF (Datei); (* Abbruch, wenn das Zeilenende erreicht ist; also wenn EOF TRUE liefert *)
Close (Datei); (* Datei schliessen *)
end; // datei einlesen
//Paremeter übergabe
if ParamCount > 0 then
begin
case LowerCase(ParamStr(1)) of
'-l':
begin
writeln('Unterstuetzte Transceiver');
// Nun erstellen wir das Objekt TProcess und
// weisen es der Variable AProcess zu.
AProcess := TProcess.Create(nil);
// Erzeugen des TStringList Objekts.
AStringList := TStringList.Create;
// Gibt an, welcher Befehl vom Prozess ausgeführt werden soll
{$IFDEF WIN32}
AProcess.CommandLine := rigctlpath+'rigctl.exe -l';
{$ENDIF}
{$IFDEF LINUX}
AProcess.CommandLine := 'rigctl -l';
{$ENDIF}
//writeln( rigctlpath + 'rigctl.exe -l' );
// Wir definieren eine Option, wie das Programm
// ausgeführt werden soll. Dies stellt sicher, dass
// unser Programm nicht vor Beendigung des aufgerufenen
// Programmes fortgesetzt wird. Außerdem geben wir an,
// dass wir die Ausgabe lesen wollen
AProcess.Options := AProcess.Options + [poWaitOnExit, poUsePipes];
// Startet den Prozess, nachdem die Parameter entsprechend
// gesetzt sind
AProcess.Execute;
// Folgendes wird erst nach Beendigung ausgeführt
// Die Ausgabe wird nun in die Stringliste gelesen
AStringList.LoadFromStream(AProcess.Output);
// Speichert den output in eine Datei.
AStringList.SaveToFile('output.txt');
for zeilennr:=0 to AStringList.Count-1 do begin
writeln(AStringList[zeilennr]);
end;
// Nun da die Datei gespeichert ist können wir
// TStringList und TProcess freigeben.
AStringList.Free;
AProcess.Free;
end;
'-h','-help','--help':
begin
writeln(' ');
writeln('Hilfe ');
{$IFDEF WIN32}
writeln(' Programmaufruf: qrg.exe VFOa;VFOb;mode ');
writeln(' oder ');
writeln(' qrg.exe -l fuer eine liste der verfuegbaren TRX');
writeln(' qrg.exe -h fuer diese hilfe');
{$ENDIF}
{$IFDEF LINUX}
writeln(' Programmaufruf: qrg VFOa;VFOb;mode ');
writeln(' oder ');
writeln(' qrg -l für eine liste der verfügbaren TRX');
writeln(' qrg -h für diese hilfe');
{$ENDIF}
writeln(' ');
writeln(' Die Datei qrg.ini mus angepast werden');
writeln(' Port, Geschwindigkeit, TRX Nr. sihe qrg -l');
writeln(' ');
end;
else
begin
befstr :='rigctl -m ' + trx + ' -s '+speed+' -r '+port+' F ' ;
zeile := ParamStr(1);
zeile := StringReplace(zeile, 'qrg://', '', [rfReplaceAll]);
PositionA := Pos(';', zeile)-1;
VFOa := Trim(Copy(zeile, 1, PositionA));
VFOa := StringReplace(VFOa, '.', '', [rfReplaceAll]);
befstr := befstr + VFOa;
Delete(zeile, 1, Length(VFOa)+3);
PositionB := Pos(';', zeile)-1;
writeln(' zeile: '+ zeile);
VFOb := Trim(Copy(zeile, 1, PositionB));
VFOb := StringReplace(VFOb, '.', '', [rfReplaceAll]);
writeln(' zeile vor delete: '+ zeile);
Delete(zeile, 1, Length(VFOb)+1);
writeln(' zeile nach : '+ zeile);
PositionA := Pos(';', zeile)-1;
//TRXMode := Trim(Copy(zeile, 1, Length(zeile)) );
TRXMode := Trim(Copy(zeile, 1, PositionA) );
befstr := befstr + ' m '+ TRXMode;
writeln(PositionA );
writeln(' Befehl sieht so aus: '+befstr);
writeln(' zeile: '+ zeile);
writeln(' VFOa: "'+ VFOa + '"');
writeln(' VFOb: "'+ VFOb + '"');
writeln(' TRXMode: "'+ TRXMode + '"');
// RIGCTL aufrufen
AProcess := TProcess.Create(nil);
AStringList := TStringList.Create;
AProcess.CommandLine := rigctlpath+befstr;
AProcess.Options := AProcess.Options + [poWaitOnExit, poUsePipes];
AProcess.Execute;
AStringList.LoadFromStream(AProcess.Output);
AStringList.Free;
AProcess.Free;
end;
end;// ende case
end;
end
else
begin
writeln('Kann c:\Program Files (x86)\hamlib-win32-1.2.15.3\bin\rigctl.exe nicht finden');
end;
end.
flotte Grüße