Как мне вызвать исполняемый файл из программы на C (используя winapi)? - PullRequest
2 голосов
/ 16 февраля 2010

CreateProcess () несколько раз подходил в поисках Google ....
Можно ли считать, что это самый безопасный и эффективный метод?
Если это так, я бы хотел использовать вывод вызванного процесса.
Как я знаю, что он завершен, прежде чем продолжить в программе C?

Спасибо.

Ответы [ 5 ]

2 голосов
/ 16 февраля 2010

ShellExecute Может использоваться для создания процесса, это более удобный способ передачи аргументов.

Но если вы хотите использовать результаты процесса, тогда CreateProcess, вероятно, является вашей лучшей ставкой

С помощью CreateProcess вы можете передать STARTUPINFO структуру, которую можно использовать для передачи дескриптора файлового канала в Standard Out процесса.

CreateProcess вернет PROCESS_INFORMATION структуру, содержащую HANDLE, для созданного процесса. Этот дескриптор станет сигнальным при выходе из процесса.

Таким образом, вы можете WaitForSingleObject на дескрипторе процесса, чтобы дождаться завершения вывода.

Не забудьте CloseHandle на дескрипторе процесса и дескрипторе потока, когда вы закончите.

1 голос
/ 16 февраля 2010

Если вам нужен полный контроль (изменение стандартного входа / выхода и т. Д.), CreateProcess - ваш лучший вариант. Если вы выполняете что-то, указанное пользователем, вам действительно нужно использовать ShellExecute [Ex], поскольку CreateProcess не будет работать для приложений, которым требуется повышение уровня UAC (ShellExecuteEx также может дать вам дескриптор дочернего процесса при запуске приложений )

1 голос
/ 16 февраля 2010

Классическим источником для того, как выполнить программу Windows и перехватить ее вывод, является эта статья на MSDN - на самом деле это не так сложно, как кажется.

1 голос
/ 16 февраля 2010

CreateProcess() - довольно низкоуровневая функция для порождения подпроцессов, и она может быть не самым удобным вариантом. Для программы на C, где вам нужно прочитать выходные данные, рассмотрите popen() (обратите внимание, что MS CRT ставит подчеркивание перед своим именем):

FILE *f = _popen("dir", "r");
char buf[1000];
while (fgets(buf, sizeof(buf), f)) {
    // .. process output using stdio functions
}
_pclose(f);
1 голос
/ 16 февраля 2010

Зависит от того, как вы измеряете эффективность. system() эффективен для программиста.

Также см. exec() и его многочисленных братьев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...