COM and Threads

Teja tejovathi.p at gmail.com
Mon Oct 16 10:43:33 CEST 2006


Teja wrote:
> Roger Upole wrote:
> > "Teja" <tejovathi.p at gmail.com> wrote:
> > >
> > > Roger Upole wrote:
> > >
> > >> "Teja" <tejovathi.p at gmail.com> wrote:
> > >> >
> > >> > Roger Upole wrote:
> > >> >
> > >> >> "Teja" <tejovathi.p at gmail.com> wrote:
> > >> >> >I have an application which uses COM 's Dispatch to create a COM based
> > >> >> > object. Now I need to upgrade the application to a threaded one. But
> > >> >> > its giving an error that COM and threads wont go together. Specifically
> > >> >> > its an attribute error at the point where COM object is invoked. Any
> > >> >> > pointers please??????
> > >> >> >
> > >> >>
> > >> >> An actual traceback would help.
> > >> >> At a guess, when using COM in a thread
> > >> >> you need to call pythoncom.CoInitialize and
> > >> >> CoUninitialize yourself.
> > >> >>
> > >> >>      Roger
> > >> >
> > >> > Actually Roger, this is the scenario....
> > >> >
> > >> > I create a COM object at the beginnning of the main thread. In the sub
> > >> > thread, I need to access the same instance of the COM object. If it
> > >> > were a normal object ie. not a COM obj, i was able to do it. But if it
> > >> > were a COM object, its giving an attribute error? Should I pass a COM
> > >> > object to the thread. If so How? Please let me know ASAP... Thnks
> > >> >
> > >>
> > >> To pass COM objects between threads, usually they'll need to be marshaled
> > >> using pythoncom.CoMarshalInterThreadInterfaceInStream, and unmarshaled
> > >> with pythoncom.CoGetInterfaceAndReleaseStream.
> > >>
> > >>          Roger
> > >
> > > I really appreciate your quick reply....Can u please let me know how to
> > > do marshalling and unmarshalling or any good refrences to do it.
> > > Because i tried to do it. I got some errors ans so I left it...
> > >
> > > Thnks again...
> > >
> >
> > Here's a simple example using Internet Explorer.
> >
> > import win32com.client, pythoncom, thread
> > ie=win32com.client.Dispatch('internetexplorer.application')
> > ie.Visible=1
> >
> > def nav(istream, dest):
> >     pythoncom.CoInitialize()
> >     d=pythoncom.CoGetInterfaceAndReleaseStream(istream, pythoncom.IID_IDispatch)
> >     my_ie=win32com.client.Dispatch(d)
> >     my_ie.Navigate(dest)
> >     pythoncom.CoUninitialize()
> >
> > s=pythoncom.CoMarshalInterThreadInterfaceInStream(pythoncom.IID_IDispatch,ie)
> > thread.start_new_thread(nav, (s, 'www.google.com'))
> >
> >       Roger
>
> Thnks a lot Roger, Its working gr8..Now, once the thread is started
> with start_new_thread, is there any way to terminate it upon user's
> request. I have explored and found out that there is no thread.kill().
> So wht to do now?
>
> Teja

HI all,

I have a problem in accesing COM objects in threads. To be precise,
lets assume that I have a class GenericFunctions which is defined as
follows:

import win32com.client, pythoncom, thread
ie=win32com.client.Dispatch('internetexplorer.application')
ie.Visible=1

class GenericFunctions:

       def __init__(self):
             print "In Constructor of Generic Functions"

       def MyNavigate(self,dest):
             ie.Navigate(dest)


Now there  is another file Main.py which is defined as follows:

import win32com.client, pythoncom, thread
from GenericFunctions import *
obj = GenericFunctions()

class Mainclass:
       def __init__(self);
            print "In Constructor of Main class"

       def threadFunction(self,dest):
            pythoncom.CoInitialize()
            d=pythoncom.CoGetInterfaceAndReleaseStream(s,
pythoncom.IID_IDispatch)
            my_ie=win32com.client.Dispatch(d)
            obj.func(dest)          # this is gving an error.
            pythoncom.CoUninitialize()

if __name__ == "__main__":

s=pythoncom.CoMarshalInterThreadInterfaceInStream(pythoncom.IID_IDispatch,ie)
         thread.start_new_thread(self.nav, (s,'www.google.com')

Basically, I want to access object of GenericFunctions class inside
threadFunction(). However I was able to execute
my_ie.Navigate("google.com"). But that was not I wanted. I am not
knowing where the error is....
Please let me know the solution ASAP...

Teja.P




More information about the Python-list mailing list