Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Windows如何处理继承_C_Windows_Inheritance_Handle - Fatal编程技术网

C Windows如何处理继承

C Windows如何处理继承,c,windows,inheritance,handle,C,Windows,Inheritance,Handle,我有父进程和子进程,在父进程中,我声明要继承句柄,如下所示: 我的问题是如何通过命令行将hchildardipe句柄传递给子进程,在MSDN中,他们建议使用uging GetCommandLine(),但这只返回命令行字符串,如何将此字符串转换为可用的句柄 我尝试了CreateFile(),但它不起作用 谢谢,我的第一个建议是阅读 但是,如果您的要求是不接触stdin或stdout(或其他相关句柄),那么您可以将句柄强制转换为整数值(UINT\u PTR value=(UINT\u PTR)hc

我有父进程和子进程,在父进程中,我声明要继承句柄,如下所示:

我的问题是如何通过命令行将hchildardipe句柄传递给子进程,在MSDN中,他们建议使用uging GetCommandLine(),但这只返回命令行字符串,如何将此字符串转换为可用的句柄

我尝试了CreateFile(),但它不起作用


谢谢,我的第一个建议是阅读

但是,如果您的要求是不接触stdin或stdout(或其他相关句柄),那么您可以将句柄强制转换为整数值(
UINT\u PTR value=(UINT\u PTR)hchildradepipe;
),并将其作为字符串传递给命令行(
\u ultoa()
)。然后,子级将需要从命令行中读取整数值(
UINT\u PTR value=strtoul()
),并将其转换回句柄(
HANDLE-hChildReadPipe=(HANDLE)value;


重要的是要记住,
“继承的句柄…具有相同的值…”

我建议阅读。谢谢,但我不想重定向I/O,我想获取继承的句柄,然后将句柄强制转换为整数值(
UINT_PTR value=(UINT_PTR)hchildradepipe;
)并将其作为字符串传递给命令行(
\uuUltoa()
)。然后,子级需要从命令行读取整数值(
UINT\u PTR value=strtoul()
),并将其转换为句柄(
HANDLE-hchildradepipe=(HANDLE)value;
)。请注意,这通常不是理想的方法。好的,谢谢,我会试试。我知道这不是一个理想的方法,但它是一个要求…请阅读这里的关键是
“继承的句柄…具有相同的值…”
...
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES); 
sa.bInheritHandle = TRUE; 
sa.lpSecurityDescriptor = NULL;
// Create a pipe for the Parent process's STDOUT.  
if ( ! CreatePipe(&hChildReadPipe, &hParentWritePipe, &sa, 0) )
{
    _tprintf(_T("Error creating Pipe\n")); 
}
...

// Start the child process. 
if( !CreateProcess(
        _T("..\\Debug\\Child.exe"),
        _T("hChildReadPipe"),   // Command line.
        NULL,                   // Process handle not inheritable.
        NULL,                   // Thread handle not inheritable.
        TRUE,                   // Set handle inheritance to TRUE.
        CREATE_NEW_CONSOLE,     // 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( "\nCreateProcess failed (%d).\n", GetLastError() );
    return FALSE;
    }