web-dev-qa-db-fra.com

Comment appeler un programme externe avec des paramètres?

Je voudrais 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 extérieure, mais un fichier .exe ou batch/script réel dans l'environnement WinXP.

C ou C++ serait le langage préféré mais si cela est plus facile à faire dans tout autre langage, faites le moi savoir (ASM, C #, Python, etc.).

27
Will

Lorsque vous appelez CreateProcess (), System (), etc., assurez-vous de citer deux fois vos chaînes de nom de fichier (y compris le nom de fichier du programme de commande) au cas où votre (vos) nom (s) de fichier et/ou le chemin d'accès complet ont des espaces sinon les parties du chemin du nom de fichier sera analysé par l'interpréteur de commandes comme des arguments séparés.

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

Pour Windows, il est recommandé d'utiliser CreateProcess (). Il a une configuration plus compliquée mais vous avez plus de contrôle sur la façon dont les processus sont lancés (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 batch, 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 système, il ne devrait donc pas être nécessaire d'être pleinement qualifié, mais si vous voulez être certain, vous pouvez composer le nom de fichier complet en utilisant CSIDL_SYSTEM (n'utilisez pas simplement C:\Windows\system32\cmd.exe).

28
Roger Nelson

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

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

8
Mark Brittingham

L'une des façons les plus simples de procéder consiste à utiliser la fonction de bibliothèque d'exécution system(). Il prend une seule chaîne comme paramètre (beaucoup moins de paramètres que CreateProcess!) Et l'exécute comme si elle avait été tapée sur la ligne de commande. system() attend également automatiquement la fin du processus avant de revenir.

Il existe également des limitations:

  • vous avez moins de contrôle sur le stdin et stdout du processus lancé
  • vous ne pouvez rien faire d'autre pendant que l'autre processus est en cours (comme décider de le tuer)
  • vous ne pouvez pas obtenir un handle vers l'autre processus afin de l'interroger de quelque façon que ce soit

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

Au niveau le plus bas, sur Win32 tous les processus sont lancés par la fonction CreateProcess, qui vous donne le plus de flexibilité.

5
Greg Hewgill

exemple c ++ simple (trouvé après avoir recherché 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 (); } }
0
EnzoGuerra