Reading stdout of an external process using pipes under windows
Danny Arends
Danny.Arends at gmail.com
Thu Sep 13 13:29:32 PDT 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");
}
}
More information about the Digitalmars-d-learn
mailing list