September 13, 2012 Reading stdout of an external process using pipes under windows | ||||
---|---|---|---|---|
| ||||
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"); } } |
Copyright © 1999-2021 by the D Language Foundation