AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Tastatureingabe an ein per ShellExe gestartetes Prog. senden
Thema durchsuchen
Ansicht
Themen-Optionen

Tastatureingabe an ein per ShellExe gestartetes Prog. senden

Ein Thema von Peter_Schmidt · begonnen am 16. Nov 2007 · letzter Beitrag vom 14. Jun 2008
Antwort Antwort
Peter_Schmidt

Registriert seit: 2. Nov 2007
2 Beiträge
 
#1

Tastatureingabe an ein per ShellExe gestartetes Prog. senden

  Alt 16. Nov 2007, 16:10
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]
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Tastatureingabe an ein per ShellExe gestartetes Prog. se

  Alt 16. Nov 2007, 16:35
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]
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#3

Re: Tastatureingabe an ein per ShellExe gestartetes Prog. se

  Alt 16. Nov 2007, 18:33
Option:

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

Mach ein Scriptfile und füttere es damit.
  Mit Zitat antworten Zitat
Peter_Schmidt

Registriert seit: 2. Nov 2007
2 Beiträge
 
#4

Re: Tastatureingabe an ein per ShellExe gestartetes Prog. se

  Alt 18. Nov 2007, 04:03
@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 ), 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?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Tastatureingabe an ein per ShellExe gestartetes Prog. se

  Alt 18. Nov 2007, 08:03
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
pansen13

Registriert seit: 13. Jun 2008
1 Beiträge
 
#6

Re: Tastatureingabe an ein per ShellExe gestartetes Prog. se

  Alt 14. Jun 2008, 01:07
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
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
Wer später bremst
ist länger schnell
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Tastatureingabe an ein per ShellExe gestartetes Prog. se

  Alt 14. Jun 2008, 12:03
Wenn es um Windows-API-Funktionen geht, schau gleich in der MSDN und nicht in der Delphi Hilfe. MSDN-Library durchsuchenCreatePipe
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  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 11:44 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