2017-03-03 19 views
-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; 
} 

任意のアイデアを、なぜ?

+0

[ボイラープレートコード](https://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v = vs.85).aspx)を使用してください。それ。 –

+0

出力ファイルであるため、変数lesのアドレスはCreatePipeに渡します。 SetHandleInformationを利用してハンドルが入力されるので、その値を渡します。引数の種類とドキュメントで明確に示します。それをすべてよく読んでください。 STRICTの定義を検討してください。コンパイラはあなたの間違いを見つけることができます。 –

答えて

2

ハンドルはすでにポインタです。 outパラメータでない限り、そのアドレスは取得しません。

SetHandleInformation呼び出しから&を取り出してください。

関連する問題