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

Reply via email to