Подтвердить что ты не робот

Как вызвать внешнюю программу с параметрами?

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

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

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

4b9b3361

Ответ 1

Когда вы вызываете 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).

Ответ 2

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

Ответ 3

Пример С++:

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

Пример С#:

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

Ответ 4

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

Существуют также ограничения:

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

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

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