Frage

Ich möchte ein Windows-Programm in meinem Code aufzurufen mit im Code festgelegten Parametern selbst.

Ich sehe nicht eine externe Funktion oder Methode zu nennen, aber eine tatsächliche .exe oder Batch / Script-Datei im WinXP Umgebung.

C oder C ++ wäre die bevorzugte Sprache, aber wenn dies leichter in einer anderen Sprache, lassen Sie mich wissen getan wird (ASM, C #, Python, etc.).

War es hilfreich?

Lösung

Wenn Sie Createprocess () aufrufen, System () usw., stellen Sie sicher, dass doppelte Anführungszeichen Ihre Dateinamen-Strings (einschließlich des Befehlsprogrammdateiname) Wenn Ihr Dateiname (n) und / oder der vollständig qualifizierte Pfad Leerzeichen andernfalls werden die Teile des Dateinamens Pfad durch den Befehlsinterpreter als separate Argumente analysiert werden wird.

system("\"d:some path\\program.exe\" \"d:\\other path\\file name.ext\"");

Für Windows wird empfohlen, Createprocess () zu verwenden. Es hat Setup unordentlichen, aber Sie haben mehr Kontrolle darüber, wie die Prozesse gestartet werden (wie von Greg Hewgill beschrieben). Für eine schnelle und schmutzig können Sie auch WinExec () verwenden. (System () ist tragbar zu UNIX).

Wenn Batch-Dateien starten Sie können mit cmd.exe starten müssen (oder command.com).

WinExec("cmd \"d:some path\\program.bat\" \"d:\\other path\\file name.ext\"",SW_SHOW_MINIMIZED);

(oder SW_SHOW_NORMAL, wenn Sie das Befehlsfenster wollen angezeigt).

Windows sollte command.com oder cmd.exe im Systempfad finden, so in nicht vollständig qualifiziert sein müssen, aber wenn Sie sicher sein wollen, können Sie den vollständigen Dateinamen mit CSIDL_SYSTEM (verwenden Sie nicht einfach C: \ Windows \ system32 \ cmd.exe).

Andere Tipps

C ++ Beispiel:

char temp[512];
sprintf(temp, "command -%s -%s", parameter1, parameter2);
system((char *)temp);

C # Beispiel:

    private static void RunCommandExample()
    {
        // Don't forget using System.Diagnostics
        Process myProcess = new Process();

        try
        {
            myProcess.StartInfo.FileName = "executabletorun.exe";

            //Do not receive an event when the process exits.
            myProcess.EnableRaisingEvents = false;

            // Parameters
            myProcess.StartInfo.Arguments = "/user testuser /otherparam ok";

            // Modify the following to hide / show the window
            myProcess.StartInfo.CreateNoWindow = false;
            myProcess.StartInfo.UseShellExecute = true;
            myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;

            myProcess.Start();

        }
        catch (Exception e)
        {
            // Handle error here
        }
    }

Ich glaube, Sie suchen den Create Funktion in dem Windows-API. Es gibt tatsächlich eine Familie verwandter Anrufe, aber dies wird Ihnen den Einstieg. Es ist ganz einfach.

Eine der einfachsten Möglichkeiten, dies zu tun, ist die system() Runtime Library-Funktion zu verwenden. Es dauert einen einzelnen String als Parameter (viele weniger Parameter als CreateProcess!) Und führt es aus, als ob es in der Befehlszeile eingegeben wurden. system() auch wartet automatisch für den Prozess zu beenden, bevor er zurückkehrt.

Darüber hinaus gibt es Einschränkungen:

  • Sie haben weniger Kontrolle über die stdin und stdout des gestarteten Prozess
  • Sie können nichts anderes tun, während der andere Prozess ausgeführt wird (wie zum Beispiel die Entscheidung, es zu töten)
  • Sie können nicht mit einem Griff an den anderen Verfahren erhalten, um sie in irgendeiner Weise abfragen

Die Laufzeitbibliothek bietet auch eine Familie von exec* Funktionen (execl, execlp, execle, execv, execvp, mehr oder weniger), die von Unix Erbe abgeleitet ist und mehr Kontrolle über den Prozess bieten.

Auf der untersten Ebene, auf Win32 alle Prozesse von der CreateProcess Funktion gestartet werden, die Ihnen die Flexibilität gibt.

einfache c ++ Beispiel (gefunden nach ein paar Webseiten suchen)

#include <bits/stdc++.h>
#include <cassert>
#include <exception>
#include <iostream>

int main (const int argc, const char **argv) {
try {
    assert (argc == 2);
    const std::string filename = (const std::string) argv [1];
    const std::string begin = "g++-7 " + filename;
    const std::string end = " -Wall -Werror -Wfatal-errors -O3 -std=c++14 -o a.elf -L/usr/lib/x86_64-linux-gnu";
    const std::string command = begin + end;
    std::cout << "Compiling file using " << command << '\n';

    assert (std::system ((const char *) command.c_str ()) == 0);
    std::cout << "Running file a.elf" << '\n';
    assert (std::system ((const char *) "./a.elf") == 0);

    return 0; }
catch (std::exception const& e) { std::cerr << e.what () << '\n'; std::terminate (); }
catch (...) { std::cerr << "Found an unknown exception." << '\n'; std::terminate (); } }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top