Calling external programs from D
Stuart Delaney
Stuart_member at pathlink.com
Thu Apr 6 07:46:09 PDT 2006
There's a bug in the makeBlock functions in process.d. The first parameter to
calloc should be 1 not 0. With that change (and the private readLine one) it
works fine for me. Don't have an answer to the OP's DNS problem though.
hope this helps. cheers,
Stu
In article <ops7j4wey023k2f5 at nrage.netwin.co.nz>, Regan Heath says...
>
>On Wed, 05 Apr 2006 19:22:25 +0200, Tydr Schnubbis <fake at address.dude>
>wrote:
>>>> On Wed, 05 Apr 2006 00:36:45 -0700, kris <foo at bar.com> wrote:
>>>>> Tydr Schnubbis wrote:
>>>>>> I'm making a gui app with DWT, and I need a way to run an external,
>>>>>> command line tool and get its output. Either directly from the
>>>>>> tool's stdout, or by having it write to a file first.
>>>>>> I'm working on windows. The system() function is unusable because
>>>>>> it opens a new command line window when it starts the tool. That
>>>>>> you can get it to close the window again really fast by using
>>>>>> 'start' is not good enough
>>>>>> It doesn't have to be a portable way. If someone can tell me how
>>>>>> to call _popen or something in msvcrt.dll, I would be happy.
>>>>>
>>>>> I understand Regan posted a module to do exactly what you want.
>>>>> Maybe he'll see this, or you may be able to dig it up again from the
>>>>> archives (or via google upon the digitalmars site). Reckon the
>>>>> keywords would be something like ~ win32 pipe process regan
>>>> Here they/it is :)
>>>> Regan
>>> Thanks!
>>> But it doesn't work for me. Seems that it blocks the new process from
>>> acessing the network. Any ideas what to do?
>>
>> Here's a minimal test to show the problem:
>>
>> import lib.process;
>> import std.stdio;
>>
>> void main()
>> {
>> Process proc;
>> proc = new Process("ping google.com");
>> writef(proc.readLine());
>> }
>>
>> Compile: "dmd test.d lib/process.d lib/pipestream.d"
>
>> Output: "Ping request could not find host google.com. Please check the
>> name and try again."
>
>(Cross posted to digitalmars.D so more people see it)
>
>(You have to move the readLine function from private to public in
>pipestream, that was obviously a mistake on my part)
>
>I get the same result. Odd. I thought at first it might be because ping
>uses enviroment variables to find/use the DNS service, but adding the
>current enviroment variables to the new process makes no difference:
>
>import lib.process;
>import std.stdio;
>import std.string;
>import std.c.string;
>
>extern(C) extern char **_environ;
>
>void main()
>{
> Process proc;
> proc = new Process();
> for(int i = 0; _environ[i]; i++) {
> proc.addEnv(toString(_environ[i]).dup);
> }
> proc.execute("ping www.google.com");
> writef(proc.readLine());
>}
>
>I also tried using CreateProcessAsUser with the handle returned by:
> OpenProcessToken(GetCurrentProcess(), ..etc..
>
>it made no difference (not that I expected it to, but you never know).
>
>Does anyone have any idea why ping cannot access the DNS service?
>
>Regan
More information about the Digitalmars-d-learn
mailing list