Mit Shell oder Shellexecute einen Parameter mitgeben

  • VB6

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Brainscanner.

    Mit Shell oder Shellexecute einen Parameter mitgeben

    Hallo,

    ich kann mir Shell bzw. -execute externe Programme starten. Allerdings möchte ich diesen noch Parameter mitgeben können. Wie kann ich das von der Syntax her machen?
    Also Shell ("C:\Programme\Programm.exe Parameter")

    Ich denke mal so würde das nicht gehen, in den Hochkommas wird VB wohl versuchen exakt diesen Pfad zu finden, oder?
    Vor allem möchte ich ja nicht schon im Quelltext einen konkreten Wert angeben, sondern eine Variable einbauen, deren dynamischer Inhalt mitgegeben wird.

    Wäre schön, wenn mir jemand unter die Arme greifen könnte! :P
    Shell("C:\Programme\Programm.exe Parameter")

    Doch, genau so wird sas mit Parametern gemacht. Wenn du eine Variable benutzen willst:
    <pre>Shell("C:\Programme\Programm.exe " & Parameter)</pre>
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau
    Hi,

    ein kleines Problem hab ich dann doch noch.
    So wie ich es im Moment mache, muß ich dem Programm, das die Informationen von meinem bekommt, die Parameter zwischen 2 Gänsefüßchen präsentieren:

    Shell ("D:\Programme\execurl.exe server/php/Videorecorder/Programmieren.php?Daten='" & Command$ & "'")

    Stimmt das so? Denn so läuft es noch nicht.

    Der Block Daten muß in Hochkommas liegen und sollte nicht beachtet werden. Außerdem sind in diesem String noch einige andere Hochkommas. Hat jemand einen Tip?
    Hi, Brainscanner.

    Nur damit ich dich richtig verstehe:

    Du willst mit Shell ein Programm starten, dass diese Seite "http://server/php/blablabla=" aufruft und den Inhalt von Command$ in Hochkommas (') dranhängt? Ich hab' grad' kein VB hier, aber so wie du es gemacht hast, müsste es eigentlich klappen.

    <pre>Shell("D:\Programme\execurl.exe server/php/Videorecorder/Programmieren.php?Daten=" & "'" & Command$ & "'")</pre> So müsste es eigentlich gehen. Was kommt denn für eine Fehlermeldung?

    mfG,

    Malcolm
    Hi !

    Das ganze sieht mir so aus, als wenn du mit deinem Programm execurl.exe eine PHP-Datei aus dem Internet aufrufst. Ich bin mir zwar nicht sicher, aber meine, dass du die einfachen Gänsefüßchen (') ganz weglassen musst. Dann musst du noch aus dem Command$ ein Escape-Code machen ...

    Jue ;)
    Also ich muß zugeben, daß ich hier vielleicht auch das falsche Forum gewählt habe, weil es wohl eher ein PHP Problem ist.
    Also der Block Daten enthält mehrere Informationen. Ein Beispiel wie der Aussehen könnte:
    <pre>Pos=80937 SendungID="2048320" Sender="PRO7" Beginn="200207161830" Dauer=30 Sendung="Futurama"
    Genre="Zeichentrickserie" Bild="C:\Programme\Clickfinder\gifs\tvmovie_defaultbild.jpg"</pre>
    Da ist PHP wohl überfordert, wenn mehrere Informationen kommen, die alle mit Leerzeichen getrennt und zusätzlich noch durch viele weitere Hochkommas unterschieden werden.
    Das Programm, was letzten Endes die Informationen bekommt, kriegt nämlich leider nur die erste Information. Das heißt, ich komme so wohl nicht weiter. Ihr stimmt mir ja zu, daß ich das bisher richtig gemacht hätte (Was ist ein Escape Code?).

    Ich habe auch einen anderen Ansatz. Und zwar lasse ich die Daten selbst über Netzwerk schicken, an an Programm, was ich auch selbst geschrieben habe. Leider krieg ich das nicht hin.
    Ich hab mir diese Seite hier vb-magazin.de/new/contentid-9.html angeschaut und versucht, das nachzubauen. Wenn ich es einfach so kopiere, klappt es nicht. Wenn ich versuche nur das Nötigste zu übernehmen, ebenso wenig. Ich hab mir auch den Quelltext von der Seite runtergeladen. Das fertige Programm funktioniert natürlich. Aber um ehrlich zu sein, will ich den auch nicht wirklich benutzen. Ich will es alleine schaffen. Klar nehme ich jede Hilfe an, aber einfach einen fertigen Code übernehmen, möchte ich nur ungern, sonst lern ich ja gar nix.

    Ich denke nicht, daß es einen noch einfacheren Weg gibt als Winsock, oder? Könnte mir jemand nochmal unter die Arme greifen und vielleicht kurz erklären wie ich das machen könnte? Welche Schritte muß ich prinzipiell machen und vielleicht ein paar kleine Codeauszüge... wär klasse!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Hi !

    Schön, dass du ein Programmierer bist, der auch was lernen will. Andere Leute würden diesen fertigen Quelltext finden, durch ihren Compiler jagen und sagen: "Guck mal, was ich schönes Programmiert hab ..."


    Also,
    ein Escape-Code ist eine maskierter String. Über die Adresszeile kannst du zum Beispiel keine Leerzeichen versenden. Anstatt wird ein bestimmter Code verschickt, der so zu sagen das Leerzeichen darstellt.

    Des weiteren würde ich an deiner Stelle mal diesen WinSock-Workshop durchlesen:
    activevb.de/tutorials/tut_winsock/winsock.html
    er könnte sehr hilfreich sein. Wenn du dann noch Fragen hast, kannst du einach wieder schreiben ...

    So, ich hoffe dir weiter geholfen zu haben,
    Jue ;)
    Klar will ich was lernen! Was macht denn sonst Spaß am Programmieren? Neue Herausforderungen und die Fähigkeit einigermaßen unabhängig individuelle Probleme lösen zu können!

    Meinst Du damit jetzt %20 für ein Leerzeichen? Oder irgendwie nen Asccii Code statt direkt dem Zeichen einbinden?

    Den Workshop schau ich mir auf jeden Fall an, vielen Dank dafür!
    Hi!

    Ich hab's hinbekommen :) :) :) :)

    Leider gibt's noch einige Kinderkrankheiten zu behandeln:
    Mein Serverprogramm nimmt nur 1x während einer Laufzeit Daten entgegen. Er soll aber ständig darauf hören. Beim Versuch den zweiten Datensatz zu senden erhalte ich die Fehlermeldung (beim Client)
    "Laufzeitfehler40006
    Falsche(s) Protokoll oder Verbindungsziel für die angeforderte Transaktion oder Anforderung."

    Also ich kann solange der Client offen ist beliebig oft Daten schicken. Erst wenn der Client geschlossen wird, also die Verbindung wieder getrennt wird, streikt der Server.

    Hier mal die Quelltext:

    Client:
    <pre>'Bei Programmstart gleich zum Server verbinden und Daten schicken

    Private Sub cmdSenden_Click()
    Winsock1.SendData (Command$)
    End Sub

    Private Sub Form_Load()

    Winsock1.Connect "192.168.198.1", 1111

    End Sub</pre>

    Server:
    <pre>
    'Auf Verbindungsversuche warten
    Private Sub Form_Load()
    Winsock1.LocalPort = 1111
    Winsock1.Listen
    End Sub
    'Verbindung annehmen
    Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
    If Not Winsock1.State Then Winsock1.Close
    Winsock1.Accept requestID
    txtAusgabe.Text = "Verbindung wurde angenommen"
    End Sub
    'Daten aufnahmen und ausgeben
    Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim s As String
    Winsock1.GetData s
    txtAusgabe.Text = s
    Shell ("C:\Programme\Videotimer\Clickfinderextension.exe " & s)
    End Sub
    </pre>

    Weißt Du, was ich ändern müßte?
    Hi,

    ich habe lange nicht mit dem Winsock Steuerelement gearbeitet. Aber auf alle Fälle fehlt beim Client das
    Schliessen der Verbindung!! (Oder hast du das nur nicht gepostet ?? ;) )

    In Deinem Beispiel würde ich es in die Form_Unload Routine packen.

    <pre>
    Winsock1.Close
    </pre>


    bye ...

    LaMa5.

    P.S.
    Und das nächste mal bitte keinen Doppelpost !!
    Die Wissenschaft wird nie ein besseres Kommunikationssystem in den Büros erfinden können als die Kaffeepause.
    (Autor: Earl Wilson, amerik. Schriftsteller)

    https://www.serviceteam-md.de

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „LaMa5“ ()

    Ne, funktioniert leider nicht. Also es funktioniert schon, aber leider nicht besser als vorher. Ich hab immer noch das gleiche Problem.
    Und vergessen hab ich leider auch nichts, das hatte ich nicht. :(
    Aber jetzt hab ich wenigstens mal das.
    Hat jemand noch weitere Vorschläge?
    hi !

    zu deinem 2. problem hab ich wahrscheinlich ein lösung:

    füge deinem server mal folgende routine zu:


    Private Sub Winsock1_Close() 'Wenn der Cleint die Verbindung beendet
    Winsock1.Close 'Zur sicherheit selber disconnecten
    Winsock1.Listen 'Wieder auf Requests warten
    End Sub


    jue ;)
    Hey, danke für den Tip! Listen hat schon gereicht. Ich wußte zunächst nicht, daß man ihm das explizit sagen muß. Ich war davon ausgegangen, daß das Listen beim Programmstart praktisch für die gesamte Laufzeit gelten würde. Jetzt läuft's!

    Ursprünglich sollte das nur ein Programm arbeiten, was mit einem anderen zusammenarbeitet.

    Allerdings bin ich nun ein wenig auf den Geschmack gekommen :) Daher würde ich gern selbst so ein Programm steuern (Videotimer, steuert praktisch die Hersteller Softwares diverser TV Karten fern, um als Videorekorder zu fungieren). Dafür brauche ich eine Scheduler Engine. Wie mach ich sowas denn am geschicktesten? Ich denke nicht, daß es besonders ökonomisch wäre, jede Sekunde auf's Neue zu prüfen, ob's jetzt was zu tun gibt. Aber einen anderen Einfall hab ich noch nicht. Gibt's hier Vorschläge?
    Also jede Minute würde doch auch reichen, oder? Ansonsten gibts doch noch den Windows Taskplaner... ;)
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Agent“ ()

    Ja, das stimmt eigentlich. Ich glaube ich könnte das auch etwas komplexer aufbauen. Zum Beispiel könnte ich ihn jede Stunde überprüfen lassen, ob in der laufenden Stunde etwas anfällt, wenn ja, könnte ich auf minutengenaue Checks überspringen und wenn dann in einer laufenden Minute Arbeit anfällt, sekundengenau - bis zum Eintreten der Aktion, dann geht's wieder zur stündlichen Überprüfung. Könnte man machen, oder?