C++ CreateProcess 无法从 Windows 7 上的套接字接收路径 (64)
Posted
技术标签:
【中文标题】C++ CreateProcess 无法从 Windows 7 上的套接字接收路径 (64)【英文标题】:C++ CreateProcess fail receiving path from socket on Windows 7 (64) 【发布时间】:2014-09-04 08:29:33 【问题描述】:我正在尝试使用 CreateProcess() 函数制作一个简单的应用程序控制器。程序接收到将由套接字执行的程序的路径并将其存储到 char[] 变量中,然后将变量发送给将执行它的函数。
我得到的错误是
Client: Received data is: C:\Windows\System32\calc.exe
Server: Bytes received: 30.
CreateProcess failed (123).
(2) = ERROR_FILE_NOT_FOUND
我尝试使用双斜杠 (//),但收到错误 (123)
Client: Received data is: C:\\Windows\\System32\\calc.exe
Server: Bytes received: 33.
CreateProcess failed (123).
(123) = ERROR_INVALID_NAME
接收程序执行路径的函数:
bytesRecv = recv(m_socket, recvbuf, 200, 0);
if (bytesRecv == SOCKET_ERROR)
printf("Server: recv() error %ld.\n", WSAGetLastError());
else
printf("\nClient: Received data is: %s\n", recvbuf);
printf("Server: Bytes received: %ld.\n", bytesRecv );
NewProcess(1,LPWSTR(recvbuf)); // <---- Call to NewProcess function with path
以及启动进程的函数:
void NewProcess(int count,LPWSTR cmd)
LPTSTR concatenation = _T(" ");
LPTSTR cmdArgs = NULL;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW;
// Start the child process.
if( !CreateProcess( NULL, // Program full path
cmd, // Arguments
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;
// 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 );
你能告诉我哪里出了问题,我想是关于变量类型的问题,但我找不到错误。
提前致谢。
【问题讨论】:
在调用 CreateProcess() 之前调试 'cmd' 参数的输出,它可能会被破坏 【参考方案1】:问题出在这里:
LPWSTR(recvbuf)
您已将缓冲区转换为指向宽字符数组的指针,但事实并非如此。我们可以这么说,因为就在你写之前:
printf("\nClient: Received data is: %s\n", recvbuf);
这意味着recvbuf
是一个指向 8 位 ANSI 字符数组的指针。要么使用CreateProcessA
,要么从ANSI 转换为UTF-16。
你应该从中吸取的教训是,每次你转换一个字符数组时,你很可能会出错。编译器可能反对您传递recvbuf
,因为它正确确定recvbuf
的格式错误。通过强制转换,您只是在压制编译器并对其撒谎。您的演员不会使recvbuf
成为LPWSTR
。它仍然是LPSTR
,但您已告诉编译器忽略该错误。
您需要确保recvbuf
以空值结尾。如果传输失败,并且recvbuf
不是以空值终止的,则说明存在缓冲区溢出情况。
最后,转义反斜杠只能在源代码中执行。
【讨论】:
谢谢!我使用了 CreateProcessA 并且 recvbuf 没有以空值终止。我添加了recvbuf[bytesRecv - 2] = '\0';
以消除从键盘输入接收到的\n
,并在字符串末尾添加正确的空字符,然后再将其发送到 CreateProcess 函数。它现在工作正常。再次感谢;)以上是关于C++ CreateProcess 无法从 Windows 7 上的套接字接收路径 (64)的主要内容,如果未能解决你的问题,请参考以下文章
无法识别 C++ CreateProcess 'telnet'
CreateProcess 无法在 Windows 7 中启动 Adobe Reader
为啥 CreateProcess 给出错误 193(%1 不是有效的 Win32 应用程序)