hello! I wrote a python parent script which starts a
separate script in a new process (under Windows XP Pro SP2, Python 2.4.1).
Through anonymous pipes I have made a bidirectional communication to the
child. I also embedded the parent script in cpp and it works too! Now I have
exported the parent functions in a dll, but when I call the dll in visual basic
6, the client script does not start and I cannot communicate over the pipes.
When I use the dll in CPP it works too!. Perhaps you can help me and can tell
me the problem why my program does not run in visual basic 6. Thank you! Regards, Michael lieschnegg I embedded following code in the dll for creating the
pipes and starting the new process: class master_interface: def __init__(self, iPort):
command='C:\Programme\Python24\python.exe'
#win32api.GetModuleFileName(0) print
command
args=['-u', 'dispatcher.py', str(iPort)]
environment=None path=None # security
attributes for pipes sAttrs =
win32security.SECURITY_ATTRIBUTES()
sAttrs.bInheritHandle = 1 # create
pipes
hStdin_r, self.hStdin_w = win32pipe.CreatePipe(sAttrs, 0)
self.hStdout_r, hStdout_w = win32pipe.CreatePipe(sAttrs, 0)
self.hStderr_r, hStderr_w = win32pipe.CreatePipe(sAttrs, 0) # set the
info structure for the new process.
StartupInfo = win32process.STARTUPINFO()
StartupInfo.hStdInput = hStdin_r
StartupInfo.hStdOutput = hStdout_w
StartupInfo.hStdError = hStderr_w
StartupInfo.dwFlags = win32process.STARTF_USESTDHANDLES # Create
new output read handles and the input write handle. Set # the
inheritance properties to FALSE. Otherwise, the child inherits # these
handles; pid =
win32api.GetCurrentProcess() tmp =
win32api.DuplicateHandle(
pid,
self.hStdin_w,
pid,
0,
0, # non-inheritable!!
win32con.DUPLICATE_SAME_ACCESS) # Close
the inhertible version of the handle
win32file.CloseHandle(self.hStdin_w)
self.hStdin_w = tmp tmp =
win32api.DuplicateHandle(
pid,
self.hStdout_r,
pid,
0,
0, # non-inheritable!
win32con.DUPLICATE_SAME_ACCESS) # Close
the inhertible version of the handle
win32file.CloseHandle(self.hStdout_r)
self.hStdout_r = tmp tmp =
win32api.DuplicateHandle(
pid,
self.hStderr_r,
pid,
0,
0,
# non-inheritable!
win32con.DUPLICATE_SAME_ACCESS) # Close the
inhertible version of the handle win32file.CloseHandle(self.hStderr_r) self.hStderr_r
= tmp # start
the process. print
"creating process" cmdline =
"%s %s" % (command, string.join(args, ' ')) hProcess, hThread,
dwPid, dwTid = win32process.CreateProcess(
None, # program
cmdline,# command line
None, # process security attributes
None, # thread attributes
1, # inherit handles, or USESTDHANDLES won't
work.
# creation flags. Don't access the console.
0, # Don't need anything here.
# If you're in a GUI app, you should use
# CREATE_NEW_CONSOLE here, or any subprocesses
# might fall victim to the problem described in:
# KB article: Q156755, cmd.exe requires
# an NT console in order to perform redirection..
environment, # new environment
path, # new directory
StartupInfo) #
normally, we would save the pid etc. here... print
"process created" # Child is
launched. Close the parents copy of those pipe handles # that
only the child should have open. # You need
to make sure that no handles to the write end of the # output
pipe are maintained in this process or else the pipe will # not
close when the child process exits and the ReadFile will hang.
win32file.CloseHandle(hStderr_w)
win32file.CloseHandle(hStdout_w)
win32file.CloseHandle(hStdin_r)
self.outQueue = Queue.Queue()
self.closed = 0
self.stdoutClosed = 0
self.stderrClosed = 0 ….......and so on……… |
_______________________________________________ Python-win32 mailing list Python-win32@python.org http://mail.python.org/mailman/listinfo/python-win32