-2
このサンプルを他のプロセス内のテキストボックスにredirect the output of a console windowに適合させる方法を理解しようとしています。コンソールI/Oのリダイレクト:無効なハンドルでSetHandleInformationが失敗する
残念ながら、読者は決して入力を受け取らないようです。
さらにデバッグすると、SetHandleInformation
の呼び出しは常にError 6: Invalid Handle
で中止されます。 hPipeOutRd
の値は悪く見えません。0x00000244のようなものです。
これは、問題を再現:
int main(int argc, char *argv[])
{
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
int result = 0;
HANDLE hPipeOutRd = INVALID_HANDLE_VALUE; // This end is passed to the pipe reader
HANDLE hPipeOutWr = INVALID_HANDLE_VALUE; // This end is passed to the child process
if (result == 0 && !::CreatePipe(&hPipeOutRd, &hPipeOutWr, &sa, 4096))
{
result = -1;
printf("Error: %u\r\n", GetLastError());
}
if (result == 0 && !::SetHandleInformation(&hPipeOutRd, HANDLE_FLAG_INHERIT, 0)) // This fails with invalid handle
{
result = -1;
printf("Error: %u\r\n", GetLastError());
}
return result;
}
任意のアイデアを、なぜ?
[ボイラープレートコード](https://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v = vs.85).aspx)を使用してください。それ。 –
出力ファイルであるため、変数lesのアドレスはCreatePipeに渡します。 SetHandleInformationを利用してハンドルが入力されるので、その値を渡します。引数の種類とドキュメントで明確に示します。それをすべてよく読んでください。 STRICTの定義を検討してください。コンパイラはあなたの間違いを見つけることができます。 –