C++ CreateProcess 无法从 Windows 7 上的套接字接收路径 (64)

标签 c++ windows sockets createprocess

我正在尝试使用 CreateProcess() 函数制作一个简单的应用程序 Controller 。程序接收将由套接字执行的程序的路径,并将其存储到 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 );
}

你能告诉我哪里出了问题吗,我想是关于变量类型的问题,但我找不到错误。

提前致谢。

最佳答案

问题在这里:

LPWSTR(recvbuf)

您已将缓冲区转换为指向宽字符数组的指针,但事实并非如此。我们可以这么说,因为就在您之前写道:

printf("\nClient: Received data is: %s\n", recvbuf);

这意味着 recvbuf 是一个指向 8 位 ANSI 字符数组的指针。使用 CreateProcessA,或从 ANSI 转换为 UTF-16。

你应该从中吸取的教训是,每次你转换一个字符数组时,你很可能会弄错。编译器可能会反对您传递 recvbuf,因为它正确地确定 recvbuf 的格式有误。通过强制转换,您只是在压制编译器并对其撒谎。您的转换不会使 recvbuf 成为 LPWSTR。它仍然是 LPSTR,但您已经告诉编译器忽略该错误。

您需要确保 recvbuf 是空终止的。如果传输失败,并且 recvbuf 不是空终止的,那么您就有缓冲区溢出条件。

最后,转义反斜杠只能在源代码中进行。

关于C++ CreateProcess 无法从 Windows 7 上的套接字接收路径 (64),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25660721/

相关文章:

c++ - 是我用错了 Xcode 还是我写的程序不对?

java - Apache Qpid/Redhat MRG - 以可移植的方式跨不同系统发送日期

c - cygwin 中的\a 没有声音

c++ - c\c++中套接字编程的问题

python - 使用 Python 让客户端套接字等待服务器套接字

c - C 中带有套接字的非阻塞 connect() 问题

c++ - 数组反向 - XOR 比使用临时对象切换慢

c++ - Qt 测试 QVERIFY2() string 和 int 连接

java - 在java中检测Windows应用程序的文本字段

windows - perl中的无缓冲IO