From: Gary S. <gst...@gm...> - 2009-09-23 12:54:58
|
Dear MinGW users, I was wondering if there is a way to use popen() (or some other function) from a GUI program to talk to another program over a pipe without opening a cmd.exe window? I am asking because I use popen() in a program I wrote called "spyview" (http://kavli.nano.tudelft.nl/~gsteele/spyview/) to talk to a gnuplot process over a pipe. However, every time a windows user opens a new gnuplot process, another cmd.exe window pops up, which can be inconvenient if you have say 30 copies running... Is there a way to avoid having a cmd.exe window appear when communicating from a GUI program to a console program over a pipe (as I do now with popen())? Alternatively, is it possible to have cmd.exe appear minimized by default? Thanks, Gary |
From: Chris W. <ch...@qw...> - 2009-09-23 13:06:46
|
Hi Gary, On Wed, 23 Sep 2009, Gary Steele wrote: > I was wondering if there is a way to use popen() (or some other > function) from a GUI program to talk to another program over a pipe > without opening a cmd.exe window? It is possible, but not trivial. See here for an example: http://www.boxbackup.org/trac/browser/box/trunk/lib/server/LocalProcessStream.cpp#L115 Basically you need to CreatePipe(), create a STARTUPINFO structure to set the child's stdout and stderr to the writable end of the pipe, pass that to CreateProcess, and then read from the readable end of the pipe. Cheers, Chris. -- _____ __ _ \ __/ / ,__(_)_ | Chris Wilson <0000 at qwirx.com> - Cambs UK | / (_/ ,\/ _/ /_ \ | Security/C/C++/Java/Ruby/Perl/SQL Developer | \ _/_/_/_//_/___/ | Stop nuclear war http://www.nuclearrisk.org | |
From: Gary S. <gst...@gm...> - 2009-09-24 06:50:50
|
Thanks Chris, this is very useful information. I have a quick question about HANDLEs: I notice that the code uses a function stream(new FileStream(readFromChild)) to convert the HANDLE that CreatePipe() returns into a c++ stream. Most of my code works with stdio FILE pointers: do you know if there is a way to open a stdio FILE pointer from a win32 HANDLE? (Maybe I can fwrite() straight to the HANDLE pointer?) Thanks, Gary On Wed, Sep 23, 2009 at 3:06 PM, Chris Wilson <ch...@qw...> wrote: > Hi Gary, > > On Wed, 23 Sep 2009, Gary Steele wrote: > >> I was wondering if there is a way to use popen() (or some other >> function) from a GUI program to talk to another program over a pipe >> without opening a cmd.exe window? > > It is possible, but not trivial. See here for an example: > > http://www.boxbackup.org/trac/browser/box/trunk/lib/server/LocalProcessStream.cpp#L115 > > Basically you need to CreatePipe(), create a STARTUPINFO structure to set > the child's stdout and stderr to the writable end of the pipe, pass > that to CreateProcess, and then read from the readable end of the pipe. > > Cheers, Chris. > -- > _____ __ _ > \ __/ / ,__(_)_ | Chris Wilson <0000 at qwirx.com> - Cambs UK | > / (_/ ,\/ _/ /_ \ | Security/C/C++/Java/Ruby/Perl/SQL Developer | > \ _/_/_/_//_/___/ | Stop nuclear war http://www.nuclearrisk.org | > > ------------------------------------------------------------------------------ > Come build with us! The BlackBerry® Developer Conference in SF, CA > is the only developer event you need to attend this year. Jumpstart your > developing skills, take BlackBerry mobile applications to market and stay > ahead of the curve. Join us from November 9-12, 2009. Register now! > http://p.sf.net/sfu/devconf > _______________________________________________ > MinGW-users mailing list > Min...@li... > > This list observes the Etiquette found at > http://www.mingw.org/Mailing_Lists. > We ask that you be polite and do the same. > > Most annoying abuses are: > 1) Top posting > 2) Thread hijacking > 3) HTML/MIME encoded mail > 4) Improper quoting > 5) Improper trimming > _______________________________________________ > You may change your MinGW Account Options or unsubscribe at: > https://lists.sourceforge.net/lists/listinfo/mingw-users > |
From: Tor L. <tm...@ik...> - 2009-09-24 07:40:32
|
> do you know if there > is a way to open a stdio FILE pointer from a win32 HANDLE? something like fdopen(_open_osfhandle(handle, _O_BINARY), "rb"). Check MSDN and mingw headers for details. Note that it doesn't work for random HANDLEs, only for HANDLEs to things that can be read and written with ReadFile and WriteFile I assume. File and (anonymous) pipe handles, maybe console handles. > (Maybe I > can fwrite() straight to the HANDLE pointer?) No way... just like you can't fwrite() to a file descriptor on POSIX. (But note that the likeness is not 100%; on Windows the "file descriptors" (the small integers that open() etc return and use) are just indexes into a table specific to the C library instance, the kernel (or the Win32 subsystem) knows nothing of them.) --tml |
From: Andy R. <min...@an...> - 2009-09-24 14:36:13
|
> I was wondering if there is a way to use popen() (or some other > function) from a GUI program to talk to another program over a pipe > without opening a cmd.exe window? I worked out a solution to this one several years ago - I can't remember the exact details now, except that they are very messy, but I remeber it involves creating an invisible window. The code is encapsulated in my open source library stlplus.sourceforge.net as the 'Backtick Subprocess' class in the portability/subprocesses module. You could take a look at the code or just use the library. |