金子です。

In message "[ruby-dev:8665] [mswin32] STDERR does not work during `_function."
    on Wed, 15 Dec 1999 21:09:54 +0900, "NAKAMURA, Hiroshi" <nakahiro / sarion.co.jp> writes:

>なひです.
>
>mswin版のRubyで「`」でコマンドを実行した際,
>標準エラーへの出力がどこかへ消えてしまうようです.
>報告だけですいません...

プロセスを起動するとき、標準エラーハンドルが正しくセットされて
いなかったようです。
入力をパイプにつなげる場合のハンドルも間違っていました。

ついでに余分と思われた DuplicateHandle() もまとめて消してしまい
ましたが、どうでしょうか。これも深い意味があったりして。
...だんだん自信がなくなってきました。

一応、NT4.0 では動くことを確認しました。
ただし、Win98 ではプロセス呼び出しのあたりはいろいろおかしくて
(今回の修正とは関係なく)テストしてると簡単にアプリケーション
エラーになります。
こんなのとか。

f = open("|./cat.exe", "w")
f.puts("hello")
f.close

もう少し調べてみる必要がありそうですね。


===============================================================
diff -u -p win32/win32.c.orig win32/win32.c 
--- win32/win32.c.orig	Sun Dec 19 22:46:25 1999
+++ win32/win32.c	Tue Dec 21 00:36:49 1999
@@ -495,7 +495,7 @@ mypopen (char *cmd, char *mode) 
 		int p[2];
 
 		BOOL fRet;
-		HANDLE hInFile, hOutFile, hStdin, hStdout;
+		HANDLE hInFile, hOutFile;
 		LPCSTR lpApplicationName = NULL;
 		LPTSTR lpCommandLine;
 		LPTSTR lpCmd2 = NULL;
@@ -533,35 +533,14 @@ mypopen (char *cmd, char *mode) 
 		aStartupInfo.dwFlags    = STARTF_USESTDHANDLES;
 
 		if (reading) {
-			aStartupInfo.hStdInput  = GetStdHandle(STD_OUTPUT_HANDLE);//hStdin;
-			aStartupInfo.hStdError  = INVALID_HANDLE_VALUE;
-			//for save
-			DuplicateHandle(GetCurrentProcess(), GetStdHandle(STD_OUTPUT_HANDLE),
-			  GetCurrentProcess(), &hStdout,
-			  0, FALSE, DUPLICATE_SAME_ACCESS
-			);
-			//for redirect
-			DuplicateHandle(GetCurrentProcess(), GetStdHandle(STD_INPUT_HANDLE),
-			  GetCurrentProcess(), &hStdin,
-			  0, TRUE, DUPLICATE_SAME_ACCESS
-			);
+			aStartupInfo.hStdInput  = GetStdHandle(STD_INPUT_HANDLE);
 			aStartupInfo.hStdOutput = hOutFile;
 		}
 		else {
-			aStartupInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); //hStdout;
-			aStartupInfo.hStdError  = INVALID_HANDLE_VALUE;
-			// for save
-			DuplicateHandle(GetCurrentProcess(), GetStdHandle(STD_INPUT_HANDLE),
-			  GetCurrentProcess(), &hStdin,
-			  0, FALSE, DUPLICATE_SAME_ACCESS
-			);
-			//for redirect
-			DuplicateHandle(GetCurrentProcess(), GetStdHandle(STD_OUTPUT_HANDLE),
-			  GetCurrentProcess(), &hStdout,
-			  0, TRUE, DUPLICATE_SAME_ACCESS
-			);
-			aStartupInfo.hStdInput = hInFile;
+			aStartupInfo.hStdInput  = hInFile;
+			aStartupInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
 		}
+		aStartupInfo.hStdError  = GetStdHandle(STD_ERROR_HANDLE);
 
 		dwCreationFlags = (NORMAL_PRIORITY_CLASS);
 
@@ -587,24 +566,12 @@ mypopen (char *cmd, char *mode) 
 		CloseHandle(aProcessInformation.hThread);
 
 		if (reading) {
-			HANDLE hDummy;
-
 			fd = _open_osfhandle((long)hInFile,  (_O_RDONLY | pipemode));
 			CloseHandle(hOutFile);
-			DuplicateHandle(GetCurrentProcess(), hStdout,
-			  GetCurrentProcess(), &hDummy,
-			  0, TRUE, (DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE)
-			);
 		}
 		else {
-			HANDLE hDummy;
-
 		    fd = _open_osfhandle((long)hOutFile, (_O_WRONLY | pipemode));
 			CloseHandle(hInFile);
-			DuplicateHandle(GetCurrentProcess(), hStdin,
-			  GetCurrentProcess(), &hDummy,
-			  0, TRUE, (DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE)
-			);
 		}
 
 		if (fd == -1) 
===============================================================


-- 
金子 尚史 (KANEKO Naoshi)
e-mail: wbs01621 / mail.wbs.ne.jp