[Zope] Zope, COM and Outlook

Joseph Griffin jgriffin@pclnet.net
Wed, 28 May 2003 12:13:49 -0600


Igor,
You could use an External Method to avoid the threading issues. Joseph
On Wed, 28 May 2003 15:29:29 +0200, Ulla Theiss wrote
> Hi Igor,
> 
> I worked almost a months on this problem can explain it and tell you 
> how I worked around it - but I've not the real solution:
> 
> The difference between your Python Test-Program and Zope is, that the
> test-program probably has only one thread, but Zope works with more 
> than one.
> 
> As explained in Hammond/Robinson (Python Programming on Win32) you have
> to initialize each thread with COM.
> There are differences, if the COM-Object lives in a free-threaded or in
> a sigle-threaded apartment.
> 
> for a single-threaded apartment it's like this:
> 
> Main-Thread:
> 	anchor = [COMObject()]
>         object_stream =
> pythoncom.CoMarshalInterThreadInterfaceInStream(pythoncom.IID_IDispatch, 
anchor)        pyHandle, id = beginthreadex(None, 0, handleRequest,
> (clientSocket, addr, object_stream), 0)
> 
>         and don't forget to pump the messages ...
> 
> Each Thread:
> def handleRequest(clientSocket, addr, object_stream):
>     pythoncom.CoInitialize()
>     anchor = pythoncom.CoGetInterfaceAndReleaseStream(object_stream,
> pythoncom.IID_IDispatch)
>     anchor = Dispatch(anchor)
>        
>     already, you can use it ...
> 
> Right now, I haven't found the right place to add this code to ZOPE. So
> I wrote a little separate process, which does connect to COM and ZOPE
> just talks with this separate process ....
> 
> Have fun with it! And please write it to the list, if you find a better
> solution!
> 
> Ulla.
> 
> Igor Leturia schrieb:
> > 
> >   Hi all!
> > 
> >   I need to obtain someone's e-mail address from Outlook's default
> > address book. I found a piece of python code in the internet which I
> > modified, and it now looks like this:
> > 
> > import codecs, win32com.client
> > 
> > def obtainaddress(name):
> >     # Create instance of Outlook
> >     o = win32com.client.Dispatch("Outlook.Application")
> >     mapi = o.GetNamespace("MAPI")
> >     folder =
> > mapi.GetDefaultFolder(win32com.client.constants.olFolderContacts)
> >     print folder.Item("Igor Leturia").Address
> >     o = None
> > 
> > obtainaddress('Igor')
> > 
> >   The code needs win32com, so I installed ActivePython and copied the
> > win32com folder to Zope's lib. I tested the code in Zope's python and it
> > works.
> > 
> >   But as I need to access it from Zope, I included the function in one
> > of the Zope source modules (User.py to be precise). And when I call it
> > from DTML, it gives me an error:
> > 
> > Error Type: com_error
> > Error Value: (-2147221008, 'CoInitialize not called.', None, None)
> > 
> >   I've put some traces and I know the error is in the first line, o =
> > win32com.client.Dispatch("Outlook.Application").
> > 
> >   Any ideas? Thanks in advance,
> > 
> >                         Igor Leturia
> > 
> > P.S.: Zope's traceback says:
> > 
> > Traceback (innermost last):
> >   File C:\Zope\lib\python\ZPublisher\Publish.py, line 150, in
> > publish_module
> >   File C:\Zope\lib\python\ZPublisher\Publish.py, line 114, in publish
> >   File C:\Zope\lib\python\Zope\__init__.py, line 159, in
> > zpublisher_exception_hook
> >     (Object: Zope)
> >   File C:\Zope\lib\python\ZPublisher\Publish.py, line 98, in publish
> >   File C:\Zope\lib\python\ZPublisher\mapply.py, line 88, in mapply
> >     (Object: AAAAA)
> >   File C:\Zope\lib\python\ZPublisher\Publish.py, line 39, in call_object
> >     (Object: AAAAA)
> >   File C:\Zope\lib\python\OFS\DTMLMethod.py, line 130, in __call__
> >     (Object: AAAAA)
> >   File C:\Zope\lib\python\DocumentTemplate\DT_String.py, line 473, in
> > __call__
> >     (Object: AAAAA)
> >   File C:\Zope\lib\python\DocumentTemplate\DT_Util.py, line 159, in eval
> >     (Object: acl_users.getUser('IGOR').getMail())
> >     (Info: acl_users)
> >   File <string>, line 2, in f
> >   File C:\Zope\lib\python\AccessControl\User.py, line 299, in getMail
> >   File C:\Archivos de
> > programa\Python21\Lib\site-packages\win32com\client\__init__.py, line
> > 92, in Dispatch
> >   File C:\Archivos de
> > programa\Python21\Lib\site-packages\win32com\client\dynamic.py, line 81,
> > in _GetGoodDispatchAndUserName
> >   File C:\Archivos de
> > programa\Python21\Lib\site-packages\win32com\client\dynamic.py, line 72,
> > in _GetGoodDispatch
> > com_error: (see above)
> > 
> > _______________________________________________
> > Zope maillist  -  Zope@zope.org
> > http://mail.zope.org/mailman/listinfo/zope
> > **   No cross posts or HTML encoding!  **
> > (Related lists -
> >  http://mail.zope.org/mailman/listinfo/zope-announce
> >  http://mail.zope.org/mailman/listinfo/zope-dev )
> 
> _______________________________________________
> Zope maillist  -  Zope@zope.org
> http://mail.zope.org/mailman/listinfo/zope
> **   No cross posts or HTML encoding!  **
> (Related lists - 
>  http://mail.zope.org/mailman/listinfo/zope-announce
>  http://mail.zope.org/mailman/listinfo/zope-dev )


"A living dog is better than a dead lion."    Ecclesiastes 9:4