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
Permalink
Reply