5

MSDN によると、これは子 stdout を親 stdout にリダイレクトしますが、そうではありません。何が問題なのですか?

   PROCESS_INFORMATION pi;
   STARTUPINFOA si;

   ZeroMemory( &si, sizeof(si) );
   si.cb = sizeof(si);
   ZeroMemory( &pi, sizeof(pi) );
   si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
   si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
   si.dwFlags |= STARTF_USESTDHANDLES;

   BOOL ret = CreateProcessA( 0, cmd_line, 0, 0, TRUE, CREATE_NO_WINDOW, 0, 0, & si, & pi);

DuplicateHandle を使用しても役に立ちません。

HANDLE out, err;//global variables
...
PROCESS_INFORMATION pi;
STARTUPINFOA si;

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );  
BOOL ret = DuplicateHandle( GetCurrentProcess(), GetStdHandle(STD_OUTPUT_HANDLE),  GetCurrentProcess(), &out, 0, TRUE, DUPLICATE_SAME_ACCESS);//todo check ret
ret = DuplicateHandle( GetCurrentProcess(), GetStdHandle(STD_ERROR_HANDLE),  GetCurrentProcess(), &err, 0, TRUE, DUPLICATE_SAME_ACCESS);//todo check ret

si.hStdOutput = out;
si.hStdError = err;
si.dwFlags |= STARTF_USESTDHANDLES;

ret = CreateProcessA( 0, cmd_line, 0, 0, TRUE, CREATE_NO_WINDOW, 0, 0, & si, & pi);
4

3 に答える 3

6

BOOL ret = CreateProcessA( 0, cmd_line, 0, 0, TRUE, CREATE_NO_WINDOW, 0, 0, & si, & pi);

CREATE_NO_WINDOWはこの動作を引き起こします。削除してください:

BOOL ret = CreateProcessA( 0, cmd_line, 0, 0, TRUE, 0, 0, 0, & si, & pi);

于 2013-11-07T19:18:25.027 に答える
2

まず、マイケルのアドバイスに同意します。Windows 98 をサポートする必要がある何らかの非常識な理由がない限り、A バージョンを使用するべきではありません。ヒント: 使用しないでください。W バージョンのみを使用する必要があります。いつも#define UNICODE!!!

ドキュメントによると:

STARTF_USESTDHANDLES 0x00000100hStdInputhStdOutputおよび hStdError membersには、追加情報が含まれています。

プロセス作成関数の 1 つを呼び出すときにこのフラグを指定する場合は、ハンドルを継承可能にし、関数の bInheritHandlesパラメーターを TRUE に設定する必要があります。詳細については、継承の処理を参照してください。

によって返されるGetStdHandleハンドルは、継承可能なハンドルである必要はありません。継承できないか、疑似ハンドルである可能性があります。実際、それらはまったく存在しない可能性があり、null または INVALID_HANDLE_VALUE である可能性があります。これも確認する必要があります。

継承不可能なハンドルまたは疑似ハンドルから継承可能なハンドルを取得するには、次を使用する必要があります。DuplicateHandle

于 2013-09-27T13:36:30.160 に答える