Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Tastatureingabe an ein per ShellExe gestartetes Prog. senden (https://www.delphipraxis.net/103501-tastatureingabe-ein-per-shellexe-gestartetes-prog-senden.html)

Peter_Schmidt 16. Nov 2007 15:10


Tastatureingabe an ein per ShellExe gestartetes Prog. senden
 
Moin Moin,

ich habe da ein etwas außergewöhnliches Problem welches ich nicht lösen kann (bin kein Profi im Programmieren).
Ich rufe in einem Programm bei "Button.Click" per ShellExecute das Programm Plink.exe im Hintergrund auf, um damit einen Port über SSH2 zu Tunneln (Plink.exe ist die Konsolenversion des SSH-Clients Putty). Die Parameter übergebe ich als String-Variable "Parameter" (siehe Code).

Delphi-Quellcode:
   ShellExecute(Handle,
               'open',
               'plink.exe',
               PChar(Parameter),
               nil,
               SW_HIDE);
Soweite kein Problem (hab dazu viele Tipps hier im Forum gefunden).
Jetzt mein Problem: Wenn Plink sich auf einem PC das erste mal zu dem SSH2-Server verbindet erscheint wenn man es nicht "SW_HIDE" startet eine Meldung, dass der Host Key des Servers (quasi der Fingerabdruck der beweist dass es sich tatsächlich um den richtigen Server handelt) noch nicht gespeichert ist. Plink hält an der Stelle an bis man entweder "y" oder "n" und Enter drückt um den Server als korrekt zu bestätigen.

Gibt es eine Möglichkeit plink.exe verborgen zu starten (wie oben beschrieben), und dann nach 1-2 Sekunden die Tastatureingabe "y" und "Enter" zu übergeben. Also so, dass mein Programm mir die Tastatureingabe abnimmt und jedesmal wenn Plink gestartet wird für den User im Hintergrund "y"+"Enter" eingibt. Wäre super wenn mich jemand in die richtige Richtung schupsen könnte.

[edit=SirThornberry]Titel korrigiert - Mfg, SirThornberry[/edit]

Apollonius 16. Nov 2007 15:35

Re: Tastatureingabe an ein per ShellExe gestartetes Prog. se
 
Die klassische Variante verwendet CreateProcess und umgeleiteten Input und Output. Da ich heute in geduldiger Stimmung bin, gibt es die Gebrauchsanweisung frei Haus:
Delphi-Quellcode:
var StartStruct: STARTUPINFO; //Anweisungen für den Prozess-Start
    ProcInfo: PROCESS_INFORMATION; //das kriegen wir zurück
    WriteInput, ReadOutput: THandle; //hierüber können wir mit dem Prozess kommunizieren
    SecAttr: SECURITY_ATTRIBUTES; //hiermit sagen wir, dass die Handles vererbbar werden sollen

ZeroMemory(@StartStruct, Sizeof(StartStruct));
StartStruct.cb:=SizeOf(StartStruct); //Die Größenangabe muss stimmen! 

StartStruct.dwFlags:=STARTF_USESTDHANDLES; // Wir wollen die Standard-Handles umleiten

SecAttr.nLength := SizeOf(SecAttr);
SecAttr.lpSecurityDescriptor := nil; //Standard-Sicherheit
SecAttr.bInheritHandle := True; //vererbbar

CreatePipe(ReadOutput, StartStruct.hStdOutput, @SecAttr, 0);
CreatePipe(StartStruct.hStdInput, WriteInput, @SecAttr, 0); //die Handles erzeugen

CreateProcess('AppName', 'Commandline', nil, nil, true, 0 {oder CREATE_NEW_CONSOLE}, nil, nil, StartStruct, ProcInfo);

CloseHandle(StartStruct.hStdOutput);
CloseHandle(StartStruct.hStdInput);
CloseHandle(ProcInfo.hProcess); //Nur falls du das Prozesshandle nicht brauchst
CloseHandle(ProcInfo.hThread);

//jetzt mit ReadFile/WriteFile kommunizieren

CloseHandle(WriteInput);
CloseHandle(ReadOutput);
Mit den Parametern von CreateProcess kannst du ein bisschen experimentieren, da gibt es ziemlich viele Möglichkeiten. Auch die Felder in STARTUPINFO bieten einige Optionen, z.B. ob der Prozess versteckt gestartet werden soll. Insgesamt kann ich dir nur die MSDN ans Herz legen.

[edit=Sharky]Auf Wunsch von Apollonius habe ich den Quellcode heute durch eine "fehlerfreie" Version ersetzt. Mfg, Sharky[/edit]

hathor 16. Nov 2007 17:33

Re: Tastatureingabe an ein per ShellExe gestartetes Prog. se
 
Option:

-m: read a remote command or script from a file

Mach ein Scriptfile und füttere es damit.

Peter_Schmidt 18. Nov 2007 03:03

Re: Tastatureingabe an ein per ShellExe gestartetes Prog. se
 
@hathor: Die Idee hatte ich auch, funktioniert jedoch nicht (hab´s getestet), da die Befehle erst nach erfolgter Verbindung ausgeführt werden. Meine "Sache" ist noch davor. Trotzdem natürlich Danke.


@Apollonius: Danke für deine ausführliche Hilfe- hab´s hinbekommen. Hab mich ein wenig eingelesen (wusste durch dich wonach ich suche :wink: ), und schicke jetzt fröhlich Ein- und Ausgaben per Pipes. :???:



Ich hab´s jetzt nicht ausprobiert, fällt mir gerade ein:

Per ShellExe kann ich ja nur Konsolenanwendungen unsichtbar mit "SW_HIDE" starten. Der "Calc" (Windows-Taschenrechner) wird ja z.B. auch angezeigt wenn ich ihn auf diese Weise starte. Gibt es eine Möglichkeit jegliche Anwendungen verborgen zu starten?

SirThornberry 18. Nov 2007 07:03

Re: Tastatureingabe an ein per ShellExe gestartetes Prog. se
 
gibt es nicht. Schau dir zum Beispiel eine Delphianwendung an. Da kannst du auch Formulare zu jedem beliebigen Zeitpunkt kreieren mit mit Show anzeigen. Und das kann Windows beim Start des Programmes schlecht unterbinden das irgendwann wenn ein Fenster angezeigt wird dieses unsichtbar ist.

pansen13 14. Jun 2008 00:07

Re: Tastatureingabe an ein per ShellExe gestartetes Prog. se
 
Ich weiß nicht ob man das hier im Forum so macht, aber ich mach mal hier weiter im Thread.

Und zwar ist es schön und gut das geschrieben wird das jemand etwas geschafft hat, aber dann wird nicht geschrieben wie derjenige es geschaftt hat. Leider bringt mich das nicht weiter.

Ich hab ein ähnliches Problem wie hier besprochen wird.

Ich hab ein dämlichen Programm, sagen wir er heißt hallowelt.exe und liegt auf der festplatte g

also würde man mit

Zitat:

g:\>hallowelt.exe
das programm starten können. das programm würde dann in der nächsten zeile den berühmten text ausgeben und sich beenden. Das ganze sieht dann ungefährt so aus

Zitat:

g:\>hallowelt.exe
Hallo Welt!
g:\>
jetzt hab ich natürlich nicht nur ein solch kurzweiliges Programm sondern hab hier eine komplexe simulation laufen die immer schön zwischen ergebnisse rauswirft mal ein paar zich Zeilen und mal nur 4, das bedeutet einiges an Text wird die Dosbox runtergespült.

ich hätte nun gerne eine Graphische Oberfläche gebastelt mit der ich bequem die simulations einstellungen editieren kann (ist schon fertig) und bei der ich dann nur noch auf den startbutton drücke und das ganze startet und die ganzen Ausgaben von dem Programm werden in einer Memobox oder ähnlichem ausgegeben.

Ich dachte das die Technik bei einem Hallo welt programm aufruf ähnlich sein müsste. Hab also das hallo welt ding geschrieben, und eine testanwendung, die mit
Delphi-Quellcode:
ShellExecute(0, 'open', 'G:\HalloWelt.exe', nil, nil, SW_NORMAL);
sogar das programm startet und und man dieses in einer Dosbox sieht.

jetzt müsste ich nur noch die cout ausgabe, bzw. die standardausgabe des hallowelt programmes in dieses memofeld (oder was auch immer) umgebogen bekommen, kann mir da jemand helfen?

Ich hab schon fast gedacht die Lösung mit den Pipes bringt es nur mein Delphi 7 hier samt der Hilfe sind mehr knüppel in die Beine statt Hilfen.

Gruß Christian

Apollonius 14. Jun 2008 11:03

Re: Tastatureingabe an ein per ShellExe gestartetes Prog. se
 
Wenn es um Windows-API-Funktionen geht, schau gleich in der MSDN und nicht in der Delphi Hilfe. MSDN-Library durchsuchenCreatePipe


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz