Как вызвать внешнюю программу с параметрами? - PullRequest
25 голосов
/ 28 января 2009

Я хотел бы вызвать программу Windows в моем коде с параметрами, определенными в самом коде.

Я не собираюсь вызывать внешнюю функцию или метод, а просто файл .exe или пакетный файл / сценарий в среде WinXP.

C или C ++ будет предпочтительным языком, но если это легче сделать на любом другом языке, дайте мне знать (ASM, C #, Python и т. Д.).

Ответы [ 5 ]

26 голосов
/ 28 января 2009

Когда вы вызываете CreateProcess (), System () и т. Д., Убедитесь, что вы заключили двойные кавычки в строки имени файла (включая имя файла командной программы) на случай, если в именах файлов и / или в полном пути указан пробел в противном случае части пути к имени файла будут интерпретироваться интерпретатором команд как отдельные аргументы.

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

Для Windows рекомендуется использовать CreateProcess (). Он имеет более сложную настройку, но у вас больше контроля над тем, как запускаются процессы (как описано Грегом Хьюгиллом). Для быстрого и грязного вы также можете использовать WinExec (). (system () переносима в UNIX).

При запуске командных файлов может потребоваться запуск с помощью cmd.exe (или command.com).

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

(или SW_SHOW_NORMAL, если вы хотите, чтобы окно команд отображалось).

Windows должна найти command.com или cmd.exe в системной переменной PATH, поэтому не нужно указывать полное имя, но если вы хотите быть уверенным, вы можете составить полное имя файла, используя CSIDL_SYSTEM (не используйте просто C: \ Windows \ system32 \ cmd.exe).

11 голосов
/ 28 января 2009

C ++ пример:

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

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
        }
    }
8 голосов
/ 28 января 2009

Я думаю, вы ищете функцию CreateProcess в Windows API. Есть на самом деле семья связанных звонков, но это поможет вам начать. Это довольно легко.

5 голосов
/ 28 января 2009

Один из самых простых способов сделать это - использовать функцию библиотеки времени выполнения system(). Он принимает одну строку в качестве параметра (намного меньше параметров, чем CreateProcess!) И выполняет ее так, как если бы она была напечатана в командной строке. system() также автоматически ожидает завершения процесса, прежде чем он вернется.

Есть также ограничения:

  • у вас меньше контроля над stdin и stdout запущенного процесса
  • вы не можете делать что-либо еще во время работы другого процесса (например, принять решение убить его)
  • вы не можете получить дескриптор другого процесса, чтобы запросить его любым способом

Библиотека времени выполнения также предоставляет семейство функций exec* (execl, execlp, execle, execv, execvp, более или менее), которые получены из наследия Unix и обеспечивают больший контроль над процессом.

На самом низком уровне в Win32 все процессы запускаются с помощью функции CreateProcess, которая обеспечивает максимальную гибкость.

0 голосов
/ 25 февраля 2019

простой пример c ++ (найден после поиска на нескольких сайтах)

#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 (); } }
...