Michael Ost wrote:
Message: 7
Date: Mon, 23 Oct 2006 14:51:34 +0200
From: Helmar Spangenberg <[EMAIL PROTECTED]>
Subject: Starting a Linux application from a Windows application
To: wine-devel@winehq.org
Cc: [EMAIL PROTECTED]
Message-ID: <[EMAIL PROTECTED]>
Content-Type: text/plain; charset="us-ascii"
Hello list,
we have a Windows application "App1" which starts another application
"App2"
using CreateProcessA, then doing some different work, and finally
waiting for
"App2" to finish using WaitForSingleObject. It is important for "App1" to
catch the exit code of "App2" as well as "App2's" messages on stdout. This
works fine with Windows applications.
Unfortunately, this does not work as soon as "App2" is a Linux application;
"App1" seems to wait forever.
Looking at the code of process.c and sync.c in kernel32, it seems to me
that
wine forgets everything about the Linux process once it is started.
I had the same experience. It seems that you can't do a synchronous call
of a linux process from a windows one.
My solution was to create a DLL interface that implements a function
called "linux_command". On Windows it is stubbed out, but in Linux it a
system() type call. App1 can link against it in Windows, but do nothing.
When you link against it at runtime in Wine, you can do the linux command.
Then I run an async bash command, capture the pid, and check for it
later. This, after long hours of attempts and dead ends.
App1
char out[1024];
linux_command("App2 & echo $! > /var/tmp/my.pid", out, sizeof(out));
linux_command("cat /var/tmp/my.pid", out, sizeof(out));
do your work
char command[1024];
sprintf(command, "test -e /proc/%s || echo finished", out);
forever
linux_command(command, out, sizeof(out));
if (strcmp(out, "finished") == 0)
break
sleep
If you are interested I can post the linux_command sources.
- Michael Ost