さてさて、前回の続き。
おそらく、CreateProcessの第2引数は、LPTSTR lpCommandLineであることから書き込み可能な領域でなくてはいけないということなんだろう。いったい何の値が帰ってくる可能性があるのか、、、ということでMSDNでCreateProcessを見てみると
Windows NT/2000:このパラメータで const 文字列(リテラル;文字列定数)を指定すると、この関数の Unicode 版である CreateProcessW 関数は失敗します。
とのこと。ほんとだ、マルチバイトでコンパイル・ビルドすると問題なく動く。
システムはこのコマンドラインの最後に NULL を追加し、必要に応じて文字列を切り捨て、
なるほど、このバッファをそのまま加工してから処理するというわけか。これでかなり謎はとけた気がする。さて、本題に戻って、、、
ReadFile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
CloseHandle( ProcessInformation.hThread ); BYTE pbBuffer[ 4096 ]; while( true ) { DWORD dwAvailSize = 0; if( !PeekNamedPipe( hReadPipe, NULL, 0, NULL, &dwAvailSize, NULL) ) { continue; } if( dwAvailSize > 0 ) { DWORD dwRead = 0; ReadFile( hReadPipe, pbBuffer, sizeof( pbBuffer ), &dwRead, NULL ); } else if( WAIT_OBJECT_0 == WaitForSingleObject( ProcessInformation.hProcess, 0 ) ) { break; } } CloseHandle( ProcessInformation.hProcess ); CloseHandle( hReadPipe ); CloseHandle( hWritePipe ); |
みたい感じなんだろうか。リソースが正しく解放されているかどうか、タスクマネージャーでも見ながら確認してみる必要はあるかもしれない。あとwhileの中でSleepもしておいた方がよいだろう。
Windows Vistaのパイプ
名前付きパイプなどの追加のトランスポート
今後もサポートはされていくようだ。Windows PowerShellのパイプも気になるところ、、、