visual studio 2010 - ReadFile在VS c++ IDE中工作得很好,但在独立时就失败了

visual studio 2010 - ReadFile works fine inside VS C++ IDE but fails stand-alone

本文关键字:独立 很好 失败 2010 studio ReadFile VS visual IDE c++ 工作      更新时间:2023-10-16

目前我有两个应用程序,一个带有GUI(使用MFC编写),另一个作为标准可执行文件。GUI应用程序(父应用程序)使用CreateProcessW调用触发标准应用程序(子应用程序),父应用程序通过匿名管道接收其子应用程序的消息。当我在VS IDE中运行父进程时,消息接收过程工作正常。然而,如果我运行父独立,父不接收任何消息从它的孩子(即父得到挂在ReadFile调用,等待消息)。

对此有什么想法吗?

注意:匿名管道创建后,所有的读操作都在一个单独的线程中进行,它不会阻塞UI或主线程。下面给出了与子进程创建和使用的参数相关的一些代码。

// pipe creation code
SECURITY_ATTRIBUTES saAttr; 
// Set the bInheritHandle flag so pipe handles are inherited.  
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
saAttr.bInheritHandle = TRUE; 
saAttr.lpSecurityDescriptor = NULL; 
// Create a pipe for the child process's STDOUT. 
if ( ! CreatePipe(&m_hChildStd_OUT_Rd, &m_hChildStd_OUT_Wr, &saAttr, 0) )
{
    m_logger->log( __FILE__, __LINE__, EventSeverity::WARNING, "Pipe cannot be created, will not receive meassages from child processes" );
}
// Ensure the read handle to the pipe for STDOUT is not inherited.
if ( ! SetHandleInformation(m_hChildStd_OUT_Rd, HANDLE_FLAG_INHERIT, 0) )
{
    m_logger->log( __FILE__, __LINE__, EventSeverity::WARNING, "Could not make the read handler of the anonymous pipe not-inheritable" );
}
SetStdHandle(STD_OUTPUT_HANDLE, m_hChildStd_OUT_Wr);
SetStdHandle(STD_ERROR_HANDLE, m_hChildStd_OUT_Wr);
//Child process creation code
m_startupInfo.lpDesktop   = NULL;
m_startupInfo.lpReserved  = NULL;
m_startupInfo.lpReserved2 = NULL;
m_startupInfo.lpTitle     = NULL;
m_startupInfo.hStdError   = GetStdHandle(STD_OUTPUT_HANDLE);
m_startupInfo.hStdOutput  = GetStdHandle(STD_OUTPUT_HANDLE);
m_startupInfo.dwFlags     = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
m_startupInfo.cb          = sizeof( m_startupInfo ); 
// launch the executable
m_isExecuting = CreateProcessW( app.exe,     // lpApplicationName
                                m_pwszParam,                                     // lpCommandLine
                                0,                                               // lpProcessAttributes
                                0,                                               // lpThreadAttributes
                                TRUE,                                            // bInheritHandles
                                CREATE_NEW_PROCESS_GROUP,                        // dwCreationFlags
                                NULL,                                            // lpEnvironment
                                curent working directory // lpCurrentDirectory
                                &m_startupInfo,                                  // lpStartupInfo
                                &m_processInfo                                   // lpProcessInformation
                              );

解决了这个问题。以前,我正在将父进程的输出和错误处理程序更新到新创建的处理程序,以便在创建子进程时检索它们。然而,这似乎不起作用。当我修改代码以通过指针或引用传递管道处理程序时,事情开始正常工作。

但是,这并不能解释为什么在IDE中运行并且在独立模式下失败。

//set the handler
SetStdHandle(STD_OUTPUT_HANDLE, m_hChildStd_OUT_Wr);
SetStdHandle(STD_ERROR_HANDLE, m_hChildStd_OUT_Wr);
//get the handler
m_startupInfo.hStdError   = GetStdHandle(STD_OUTPUT_HANDLE);
m_startupInfo.hStdOutput  = GetStdHandle(STD_OUTPUT_HANDLE);
相关文章: