"Steven Schveighoffer" <schvei...@yahoo.com> wrote in message 
news:op.vir82cineav...@localhost.localdomain...
> On Thu, 09 Sep 2010 16:25:44 -0400, Nick Sabalausky <a...@a.a> wrote:
>
>> "Steven Schveighoffer" <schvei...@yahoo.com> wrote in message
>> news:op.vipr20xfeav...@localhost.localdomain...
>>> On Tue, 07 Sep 2010 16:51:48 -0400, Nick Sabalausky <a...@a.a> wrote:
>>>
>>>>
>>>> Ah cool, looking forward to it. I was just about ready to launch into a
>>>> bunch of std.process improvements myself ;) In the meantime, it seems
>>>> that
>>>> File has an undocumented constructor that takes a file handle instead 
>>>> of
>>>> a
>>>> filename, so that should work for me.
>>>
>>> Beware, it takes a file *descriptor*, which is different from a *HANDLE*
>>> on windows.  In writing the updated std.process I had to write D code 
>>> that
>>> mimics the internals of DMC's runtime in order to translate between file
>>> descriptors and handles, not a pretty sight...
>>>
>>
>> I'm just feeding it the values I get from CreatePipe:
>> http://msdn.microsoft.com/en-us/library/aa365152(VS.85).aspx
>>
>> Seems to be working fine, though...
>
> That won't work.  I'm surprised it works at all.  DMC maintains the list 
> of handles in an array, with the index of the array being the file 
> descriptor, and the value at that element being the HANDLE.  If it's 
> working, you're extremely lucky that the unallocated slot at the index 
> that happens to be that HANDLE value has the same value as the HANDLE 
> itself.
>
> Or maybe I'm misunderstanding something...  Walter?
>

Here's a simplified example of what I'm doing:

--------------------------------
> type mainapp.d
import std.conv;
import std.process;
import std.stdio;
import std.stream;
import core.sys.windows.windows;

// From here: http://msdn.microsoft.com/en-us/library/aa365152(VS.85).aspx
extern(Windows) int CreatePipe(
    HANDLE* hReadPipe,
    HANDLE* hWritePipe,
    SECURITY_ATTRIBUTES* lpPipeAttributes,
    uint nSize);

void main()
{
    // Set up pipe
    HANDLE readHandle;
    HANDLE writeHandle;
    auto secAttr = SECURITY_ATTRIBUTES(SECURITY_ATTRIBUTES.sizeof, null, 
true);
    if(!CreatePipe(&readHandle, &writeHandle, &secAttr, 0))
        throw new Exception("Couldn't create pipe");

    auto pipeReader = new std.stream.File(readHandle, FileMode.In);

    // Run subapp
    system("subapp "~to!string(cast(size_t)writeHandle));

    // Retrieve value from pipe
    int valueFromSubApp;
    pipeReader.read(valueFromSubApp);
    writeln("Received: ", valueFromSubApp);
}


> type subapp.d
import std.conv;
import std.stdio;
import std.stream;
import std.c.windows.windows;

void main(string[] args)
{
    auto writeHandle = cast(HANDLE)std.conv.to!size_t(args[1]);
    auto pipeWriter = new std.stream.File(writeHandle, FileMode.Out);

    int value = 777;
    writeln("Sending: ", value);
    pipeWriter.write(value);
}

> dmd subapp.d
> dmd mainapp.d
> mainapp
Sending: 777
Received: 777
--------------------------------


Maybe the OS is just allowing me to use the wrong file descriptor?


Reply via email to