1、在cmd命令行中输入的命令是: E:\P2PDownLoadCall.exe “p2pdownload.exe -r image\boot.img” 结果,CreateProcess failed,而且 GetLastError的结果为2,找不到对应的文件。
2、我也没辙了,然后就用写死的路径 Text(“p2pdownload.exe -r image\boot.img”);来作为CreateProcess函数的第二个参数,结果竟可以成功。
3、我才明白,是cmd的输入是多字节的,而vs默认当前的工程为Unicode型,因此会调用CreateProcessW函数,遇到多字节的参数,肯定会保存错误,因此得出了“找不到相应的文件的错误”
4、为了验证我的错误,我将本工程改为多字节的,结果,程序就顺利执行了。默认调用的是CreateProcessA,会以多字节的形式处理参数,因此会无误地识别cmd命令行传进来的参数。
5、多字节的工程代码如下:
#include <Windows.h>
#include <stdio.h>
#include <tchar.h>
int main( int argc, TCHAR ** argv )
{
int nReturn = 1;
if ( argc < 2 )
{
nReturn = 1;
goto exit;
}
else
{
PROCESS_INFORMATION pi;
STARTUPINFO si;
DWORD dwExitCode = 1;
TCHAR szCommand[500];
ZeroMemory( &pi, sizeof( pi ) );
ZeroMemory( &si, sizeof( si ) );
si.cb = sizeof( si );
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
printf("argv[1]:%s\n",argv[1]);
_tcscpy( szCommand, argv[1] );
if ( CreateProcess( NULL, szCommand, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ) )
{
printf("CreateProcess succeeded!\n");
}
else
{
printf("CreateProcess failed!GetLastError:%d\n",GetLastError());
nReturn = 2;
goto exit;
}
WaitForSingleObject( pi.hProcess, INFINITE );
if ( GetExitCodeProcess( pi.hProcess, &dwExitCode ) )
{
printf("GetExitCodeProcess succeeded,dwExitCode is %d\n",dwExitCode);
nReturn = 0;
}
else
{
printf("GetExitCodeProcess failed,dwExitCode is %d,GetLastError:%d\n",dwExitCode,GetLastError());
nReturn = 3;
}
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
goto exit;
}
exit:
return nReturn;
}