On Sun, 24 Feb 2013 19:35:36 -0500, Vladimir Panteleev
<[email protected]> wrote:
On Monday, 25 February 2013 at 00:27:10 UTC, Steven Schveighoffer wrote:
On Sun, 24 Feb 2013 19:17:44 -0500, Vladimir Panteleev
<[email protected]> wrote:
On Monday, 25 February 2013 at 00:02:54 UTC, Steven Schveighoffer
wrote:
Hm... that message is printed out if the code cannot set the inherit
handle flag on the specific stdin.
Are you on windows 64 or 32? It's a large difference since one uses
MSVCRT and one uses DMCRT. Also, I don't have windows 64, so I can't
verify this if that's the case :)
I'm getting the same exception with DMD64 and DMD32.
Are you running from a console? If not, I think I see where the issue
is.
I am running from a console, and I don't think this would make any
difference. Maybe you intended to ask if I'm linking with
/SUBSYSTEM:WINDOWS? (I'm not)
So here is the code that is throwing that exception:
static void prepareStream(ref File file, DWORD stdHandle, string which,
out int fileDescriptor, out HANDLE handle)
{
fileDescriptor = _fileno(file.getFP());
if (fileDescriptor < 0) handle = GetStdHandle(stdHandle);
else
{
version (DMC_RUNTIME) handle = _fdToHandle(fileDescriptor);
else /* MSVCRT */ handle = _get_osfhandle(fileDescriptor);
}
if (!SetHandleInformation(handle, HANDLE_FLAG_INHERIT,
HANDLE_FLAG_INHERIT))
{
throw new StdioException(
"Failed to pass "~which~" stream to child process", 0);
}
}
Called like this:
prepareStream(stdin_, STD_INPUT_HANDLE, "stdin" , stdinFD,
startinfo.hStdInput );
Since "stdin" is what is in the exception.
It looks like you are passing stdin as the handle for stdin. From the
above, the ways this exception could fail are:
1. The file descriptor from stdin failed to come out, and windows gives
back a valid handle from GetStdHandle
2. The file descriptor is valid (0 or above), but
_fdToHandle/_get_osfhandle fails to get a valid handle
3. We have a valid handle, but for some reason SetHandleInformation fails.
I'm guessing that since you are running with a normal subsystem, with a
console, you have a valid handle. So my guess would be that
SetHandleInformation is failing.
Can you catch the exception and print out GetLastError()?
-Steve