Question

Je souhaite appeler un programme Windows dans mon code avec des paramètres déterminés dans le code lui-même.

Je ne cherche pas à appeler une fonction ou une méthode externe, mais un fichier .exe ou batch / script dans l'environnement WinXP.

C ou C ++ serait le langage préféré, mais si cela se fait plus facilement dans un autre langage, faites-le-moi savoir (ASM, C #, Python, etc.).

Était-ce utile?

La solution

Lorsque vous appelez CreateProcess (), System (), etc., veillez à mettre entre guillemets vos chaînes de noms de fichiers (y compris le nom du fichier du programme de commande) au cas où vos noms de fichiers et / ou le chemin complet auraient des espaces. sinon, les parties du chemin du nom de fichier seront analysées par l'interpréteur de commandes sous forme d'arguments distincts.

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

Pour Windows, il est recommandé d’utiliser CreateProcess (). Sa configuration est plus compliquée, mais vous avez plus de contrôle sur le lancement des processus (comme décrit par Greg Hewgill). Pour rapide et sale, vous pouvez également utiliser WinExec (). (system () est portable sous UNIX).

Lors du lancement de fichiers de commandes, vous devrez peut-être lancer avec cmd.exe (ou command.com).

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

(ou SW_SHOW_NORMAL si vous souhaitez afficher la fenêtre de commande).

Windows devrait trouver command.com ou cmd.exe dans le chemin PATH du système. Ainsi, in ne devrait pas nécessairement être pleinement qualifié, mais si vous voulez être certain de pouvoir composer le nom de fichier complet, utilisez CSIDL_SYSTEM (n'utilisez pas simplement C: \ Windows \ system32 \ cmd.exe).

Autres conseils

Exemple C ++:

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

Exemple C #:

    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
        }
    }

Je pense que vous recherchez le CreateProcess fonction dans l'API Windows. Il existe en réalité une famille d'appels liés, mais cela vous aidera à démarrer. C'est assez facile.

L’une des méthodes les plus simples consiste à utiliser la system() fonction de bibliothèque d’exécution. Il prend une seule chaîne en tant que paramètre (beaucoup moins de paramètres que CreateProcess!) Et l'exécute comme s'il était tapé sur la ligne de commande. exec* attend également automatiquement la fin du processus avant son retour.

Il existe également des limitations:

  • vous avez moins de contrôle sur les options stdin et stdout du processus lancé
  • vous ne pouvez rien faire d'autre pendant que l'autre processus est en cours d'exécution (par exemple, décider de le tuer)
  • vous ne pouvez pas accéder à l'autre processus afin de l'interroger de quelque manière que ce soit

La bibliothèque d'exécution fournit également une famille de execl fonctions (execlp, execle, execv, execvp, plus ou moins) dérivées de l'héritage Unix et offrant davantage de contrôle. sur le processus.

Au niveau le plus bas, sous Win32, tous les processus sont lancés par la fonction <=>, ce qui vous donne le plus de flexibilité.

exemple simple c ++ (trouvé après une recherche dans quelques sites Web)

#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 (); } }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top