我正在尝试创建一个简单的程序来在Windows 7(64)上的C / C ++中测试CreateProcess()函数。当我直接传递CommandLine(“szCmdline”)参数时它工作正常,但是如果我尝试通过从argv获取参数并传递给函数来发送参数我在运行时得到“错误代码2(”ERROR_FILE_NOT_FOUND“)”
我一直在寻找解决方案,并在此论坛上发现“CreateProcess-fails-under-windows-7”,但它似乎对我不起作用或者我做错了。
这是NewProcess()代码:
void NewProcess(TCHAR **cmd){
printf("Argv Inside funcion: %s\n",cmd[1]);
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
// Start the child process.
if( !CreateProcess( NULL, // No module name (use command line)
cmd[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's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi ) // Pointer to PROCESS_INFORMATION structure
)
{
printf( "CreateProcess failed (%d).\n", GetLastError() );
return;
}
printf("Process ID: %d Started",pi.dwProcessId);
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
printf("\nProcess ID: %d Terminated!",pi.dwProcessId);
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
主要功能代码:
void main(int argc, TCHAR *argv[])
{
printf("Argv outside function: %s\n",argv[1]);
//LPTSTR szCmdline = _tcsdup(TEXT("C:\\Windows\\system32\\calc.exe")); <-- **It works fine**
NewProcess(argv); // <-- **It doesn't works**
}
在运行时,cmd和argv包含相同的数据,但在CreateProcess()调用时失败。
结果:
E:\C++\VISUAL_STUDIO\NewTest> newtest.exe "C:\Windows\System32\calc.exe"
Argv outside function: C:\Windows\System32\calc.exe
Argv Inside funcion: C:\Windows\System32\calc.exe
CreateProcess failed (2).
我测试了“C:\\ windows \\ system32 \\ calc.exe”,%windir%\ system32 \ calc.exe,“C:\ Windows \ SysNative \ calc.exe”
有什么想法吗?
谢谢你的建议
答案 0 :(得分:3)
您确定void main(int argc, TCHAR *argv[])
是否正确?在Windows中,我目前使用:
int main(int argc, char *argv[])
8位ANSI字符int wmain(int argc, wchar *argv[])
16位UNICODE字符int _tmain(int argc, TCHAR *argv[])
宏定义如果你发布了什么,如果你使用了什么,你可以将LPSTR *
传递给你的函数,如果定义了UNICODE,你需要LPWSTR *
。