AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Text Datei von Delphi Programm an einen Linux PC senden
Thema durchsuchen
Ansicht
Themen-Optionen

Text Datei von Delphi Programm an einen Linux PC senden

Ein Thema von A.Griffin · begonnen am 14. Mär 2017 · letzter Beitrag vom 21. Mär 2017
Antwort Antwort
BrightAngel

Registriert seit: 13. Mär 2007
130 Beiträge
 
#1

AW: Text Datei von Delphi Programm an einen Linux PC senden

  Alt 16. Mär 2017, 08:20
Genau, das ist die Intention. Nur WinExec ist nur Zwecks Kompatibilität noch da (siehe diese Notiz ganz oben).
Mehr Kontrolle (und moderner) geht es mit der Aufruffamilie um CreateProcess. Damit kannst du dann auch sehr fein einstellen, was genau aufgerufen wird.

[Edit 1]
Anders als putty (wo es ja um Interaktivität geht), brauchst du bei pscp grundsätzlich nicht das stdIn/Out des neuen Prozesses. Jedoch bist du vermutlich am Erfolg und des Fortschritts der Übertragung interessiert!? Ich habe das jetzt bei pscp nicht getestet; vielleicht kannst du grundsätzlichen Erfolg über den ExitCode von pscp herausfinden? Wenn du mehr Details brauchst, dann müsstest du dir gegebenenfalls StdOut besorgen und die Ausgabe in deinem Programm weiterverarbeiten.
[/Edit]

[Edit 2]
Falls du das mit CreateProcess machen solltest, seien dir in der STARTUPINFO die Felder hStdOutput und hStdError (ganz unten in der Struct) wärmstens zu empfehlen
[/Edit]

[Edit 3]
Das Handle kannst du mit CreatePipe erzeugen. Dieser Aufruf erzeugt eine Pipe mit zwei verbundenen Handles. Das eine Ende kannst du dann dem neuen Prozess übergeben und aus dem anderen kannst du dann (z.B. in einem eigenen Thread in deinem Programm) wiederholt lesen, bis das Programm sich beendet/du das Programm beendest/die Ausgabe des Programms dich nicht mehr interessiert/.... Aufräumen nicht vergessen.
[/Edit]

[Edit 4]
Nachtrag: Artverwandtes Thema gefunden; Klick!
[/Edit]

Brighty
Do you have the email of god??? --- I have to tell him that I'm happy to be born!

Geändert von BrightAngel (16. Mär 2017 um 08:46 Uhr)
  Mit Zitat antworten Zitat
A.Griffin

Registriert seit: 17. Feb 2017
94 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Text Datei von Delphi Programm an einen Linux PC senden

  Alt 16. Mär 2017, 10:11
Ich habe es jetzt erstmal mit WinExec gemacht auch, wenn CreateProcess empfohlen ist. Mit WinExec ging es jetzt sehr einfach. Ich gucke mir aber, wenn ich mal Zeit habe an wie es mit CreateProcess geht. Vielen Dank an alle für die Antworten.
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.490 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Text Datei von Delphi Programm an einen Linux PC senden

  Alt 16. Mär 2017, 13:14
... wenn ich mal Zeit habe ...
  Mit Zitat antworten Zitat
A.Griffin

Registriert seit: 17. Feb 2017
94 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Text Datei von Delphi Programm an einen Linux PC senden

  Alt 16. Mär 2017, 13:35
... wenn ich mal Zeit habe ...
..oder die Software nicht läuft und ich gezwungen bin mich in CreateProcess einzulesen.
  Mit Zitat antworten Zitat
BrightAngel

Registriert seit: 13. Mär 2007
130 Beiträge
 
#5

AW: Text Datei von Delphi Programm an einen Linux PC senden

  Alt 16. Mär 2017, 14:19
Machst du es jetzt dann über den ExitCode von pscp? Was passiert, wenn du keine Verbindung zum Server aufbauen kannst? Merkt dein Programm das?

Brighty
Do you have the email of god??? --- I have to tell him that I'm happy to be born!
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.739 Beiträge
 
Delphi 6 Enterprise
 
#6

AW: Text Datei von Delphi Programm an einen Linux PC senden

  Alt 16. Mär 2017, 14:50
Wir haben das mal ungefähr so gemacht:

Delphi-Quellcode:
function SendFile:Boolean;
var output:String;
begin
output:=CaptureConsoleOutput(Command);
Result:=Pos('100%',output)>0;
end;


//Diese Funktion hab ich mal irgendwo gefunden (hier in der DP ?)
function CaptureConsoleOutput(const ACommand: String):String;
const
    CReadBuffer = 2400;
var
    saSecurity: TSecurityAttributes;
    hRead: THandle;
    hWrite: THandle;
    suiStartup: TStartupInfo;
    piProcess: TProcessInformation;
    pBuffer: array [0 .. CReadBuffer] of AnsiChar;
    dBuffer: array [0 .. CReadBuffer] of AnsiChar;
    dRead: DWord;
    dRunning: DWord;
    erg:String;
begin
    saSecurity.nLength := SizeOf(TSecurityAttributes);
    saSecurity.bInheritHandle := True;
    saSecurity.lpSecurityDescriptor := nil;
    erg:='';
    if CreatePipe(hRead, hWrite, @saSecurity, 0) then
    begin
        FillChar(suiStartup, SizeOf(TStartupInfo), #0);
        suiStartup.cb := SizeOf(TStartupInfo);
        suiStartup.hStdInput := hRead;
        suiStartup.hStdOutput := hWrite;
        suiStartup.hStdError := hWrite;
        suiStartup.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
        suiStartup.wShowWindow := SW_HIDE;

        if CreateProcess(nil, pChar(ACommand+' '), @saSecurity, @saSecurity, True, NORMAL_PRIORITY_CLASS, nil, nil, suiStartup, piProcess) then
        begin
            //repeat
                dRunning := WaitForSingleObject(piProcess.hProcess, 2000);
                Application.ProcessMessages();
                repeat
                    dRead := 0;
                    ReadFile(hRead, pBuffer[0], CReadBuffer, dRead, nil);
                    pBuffer[dRead] := #0;
                    OemToCharA(pBuffer, dBuffer);
                    erg:=dBuffer;
                until (dRead < CReadBuffer);
            //until (dRunning <> WAIT_TIMEOUT);
            CloseHandle(piProcess.hProcess);
            CloseHandle(piProcess.hThread);
        end;
        CloseHandle(hRead);
        CloseHandle(hWrite);
    end;
    Result:=erg;
end;

function Command: String;
var path:String;
begin
  //hier lag die PSCP.exe mit im Programm-Verzeichnis, daher:
  path:=ExtractFilePath(Application.ExeName);
  Result:=path+'pscp.exe -P '+Port+' -pw '+pswrd+' '+
          Dateienname+' '+username+'@'+URL+':'+targetdir;

  //alt mit keyfile im Programm-Verzeichnis:
  //Result:=path+'pscp.exe -P '+Port+' -i '+path+keyfile+' '+
  // Dateiename+' '+username+'@'+URL+':'+targetdir;
end;
Bei fernsteuern der ganzen Putty-Dinger muss man nur aufpassen, wenn mal der Server wechselt oder so, da Putty dann nachfragt, wenn eine andere Signatur gefunden wird (macht ja Sinn). Aber wenn das im Batch-Betrieb passiert ist das nervig, wobei es da wohl auch Parameter gibt, die dan ggf. verhindern können?
Ralph
  Mit Zitat antworten Zitat
BrightAngel

Registriert seit: 13. Mär 2007
130 Beiträge
 
#7

AW: Text Datei von Delphi Programm an einen Linux PC senden

  Alt 16. Mär 2017, 15:17
Ja, aber er hat es ja jetzt mit WinExec gemacht. Hatte mich da gefragt, wie er den Erfolg auswertet. Das ist ja mit CreateProcess eigentlich einfacher, oder?
Do you have the email of god??? --- I have to tell him that I'm happy to be born!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz