digitalmars.D.learn - Reading stdout of an external process using pipes under windows
- Danny Arends (42/42) Sep 13 2012 I decided to put some code here that allowed me read (via a
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"); } }
Sep 13 2012