я hev с функцией CreatProcess, введенной в заголовок windows.h для c++. всякий раз, когда я пытаюсь передать ему переменную TCHAR, содержащую команду cmd, она возвращает ошибку: CreateProcess failed (2). и для этого жду ваших объяснений и решений.
рассмотрите следующий код:
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
int _tmain( int argc, TCHAR *argv[] )
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
if( argc != 2 )
{
printf("Usage: %s [cmdline]\n", argv[0]);
return 0;
}
// Start the child process.
if( !CreateProcess( NULL, // No module name (use command line)
argv[1], // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent environment block
NULL, // Use parent starting directory
&si, // Pointer to STARTUPINFO structure
&pi ) // Pointer to PROCESS_INFORMATION structure
)
{
printf( "CreateProcess failed (%d).\n", GetLastError() );
return 0;
}
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
обратите внимание: когда я запускаю приложение с указанием его пути, он работает отлично, как => "c:\code.exe";
Если вы хотите запустить команду DOS
, вы должны запустить оболочку cmd
раньше.
CreateProcess
не делает этого для вас.
Опция /c
cmd
позволяет запустить команду в оболочке и завершить работу. Вам просто нужно создать командную строку типа cmd/c <your command here>
.
Я скомпилировал ваш код на VS2012, и я попытался: test.exe "cmd/c dir"
и он работает как шарм.
Из документации Microsoft:
Чтобы запустить командный файл (или пакетную команду), вы должны запустить командный интерпретатор; установите lpApplicationName в cmd.exe и установите lpCommandLine в следующие аргументы: /c плюс имя командного файла.
Источник: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx
Чтобы выполнить команду, реализованную командной оболочкой aka cmd.exe
, необходимо запустить cmd.exe. CreateProcess
автоматически не делает этого для вас.
Создайте командную строку формы cmd.exe/c <your command here>
. /c
означает "выполнить одну команду, а затем завершить".