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

Reply via email to