June Kim wrote:
Running the following code results in an attribute error:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Python25\lib\threading.py", line 486, in __bootstrap_inner
    self.run()
  File "testcom.py", line 10, in run
    print self.ie.locationUrl
  File "C:\Python25\Lib\site-packages\win32com\client\dynamic.py", line 500, in
__getattr__
    raise AttributeError, "%s.%s" % (self._username_, attr)
AttributeError: InternetExplorer.Application.locationUrl

It seems like the COM object isn't properly passed to the new thread.
Any roundabouts?

Welcome to the wonderful world of COM and threading. Basically,
the IWebBrowser2 object which is behind the InternetExplorer
control cannot be passed as such between threads. To pass it
between threads you need to marshal it and pass the resulting istream to the other thread which will then unmarshal it again.

There's some sample code below which does this, but you might
want to consider another approach, depending on what your app
is trying to do, such as creating an IE object per thread and/or
passing native Python objects between threads with Queues etc.

TJG

<code>
import os, sys
import threading
import time

import pythoncom
import win32com.client

class Work (threading.Thread):
def __init__ (self, marshalled_ie):
   threading.Thread.__init__ (self)
   self.marshalled_ie = marshalled_ie
def run (self):
   pythoncom.CoInitialize ()
   ie = win32com.client.Dispatch (
     pythoncom.CoGetInterfaceAndReleaseStream (
self.marshalled_ie, pythoncom.IID_IDispatch
     )
   )
   print "Threaded LocationURL:", ie.LocationURL
   pythoncom.CoUninitialize ()

ie = win32com.client.Dispatch ("InternetExplorer.Application")
ie.Visible = 1
ie.Navigate ("http://python.org";)
while ie.Busy: time.sleep (1)
print "LocationURL:", ie.LocationURL

marshalled_ie = pythoncom.CoMarshalInterThreadInterfaceInStream (
 pythoncom.IID_IDispatch, ie
)
work = Work (marshalled_ie)
work.start ()
work.join ()

ie.Quit ()

</code>
_______________________________________________
python-win32 mailing list
python-win32@python.org
http://mail.python.org/mailman/listinfo/python-win32

Reply via email to