September 13, 2012
I decided to put some code here that allowed me read (via a streamed pipe) the stdout from an external process. I didn't see something like this before and when searching I only found the new std.process in phobos development branch which doesn't have a Windows version.

If anyone feels like doing a unix version go ahead...

----------------------

import std.file, std.stdio, std.string, std.conv;

alias extern (C) FILE* function(const(char)*, const(char)*) _popen;
alias extern (C) int function(FILE*) _pclose;
alias extern (C) int function(FILE*) _fgetc;

_popen  popen;
_pclose pclose;
_fgetc  fgetc;

version(Windows){
  import core.sys.windows.windows;

  static this(){
    auto hMsvcrt = GetModuleHandleA("msvcrt.dll");
    popen  = cast(_popen)  GetProcAddress(hMsvcrt, "_popen");
    pclose = cast(_pclose) GetProcAddress(hMsvcrt, "_pclose");
    fgetc  = cast(_fgetc)  GetProcAddress(hMsvcrt, "fgetc"); //___????!!!
    write("Bound functions: ");
    writefln("popen=%s, pclose=%s, fgetc=%s\n",popen, pclose, fgetc);
  }
}else{
  /* ??? Posix anyone ??? */
}

void main(string[] args){
  int  i;
  auto pPipe = popen(toStringz("dir"), toStringz("rt"));
  if(pPipe != null){
    while((i = fgetc(pPipe)) != -1){
      write(to!char(i));
    }
    writefln("\nProcess return: %d", pclose(pPipe));
  }else{
    writeln("Command failed");
  }
}