[python-win32] com events while running wx main loop

Thomas Heller theller at ctypes.org
Fri Apr 20 11:29:55 CEST 2007


Christian K. schrieb:
> Thomas Heller wrote:
>> Christian K. schrieb:
>>> Now I installed comtypes from svn and get this error running your new
>>> example:
>>>
>>> Traceback (most recent call last):
>>>    File "C:\Dokumente und Einstellungen\ck\Desktop\x.py", line 64, in ?
>>>      Listener()
>>>    File "C:\Dokumente und Einstellungen\ck\Desktop\x.py", line 50, in 
>>> __init__
>>>      self.com_init()
>>>    File "C:\Dokumente und Einstellungen\ck\Desktop\x.py", line 59, in 
>>> com_init
>>>      self.s = comtypes.client.GetEvents(self.o, sink)
>>>    File "c:\Python24\Lib\site-packages\comtypes\client\__init__.py", 
>>> line 358, in GetEvents
>>>      raise TypeError("cannot determine source interface")
>>> TypeError: cannot determine source interface
>> 
>> First of all, when you install a new comtypes version you should clear the
>> contents of the comtypes\gen directory, so that the typelib wrappers can
>> be regenerated.  The old versions from previous comtypes releases should
>> better not be used.
> 
> I had the comtypes directory removed before installing from svn.
> 
>> Second, if you are running the exact sample that I posted then it should work
>> for InternetExplorer, and with slight changes also for Outlook.  At least
>> it worked for me.
> 
> Well, here it doesn't.

I will try to find this problem later.

> I successfully read out the Outlook inbox using comtpyes but finally 
> switched back to pywin32 because I was not able to interprete the value 
> of MailItem.CreationTime,
> e.g:
> obj.Session.Folders['mail.server.com'].Folders['INBOX'].Items.Item(1).CreationTime
> which looks like a posix timestamp which dates back to the 70th. I guess 
> pywin32 is doing some conversion there and comtypes is not?

pywin32 uses the IDispatch interface, which probably returns the time in a VARIANT with
typecode VT_DATE, and of type C double.  This way the code knows that a date/time is meant
and can convert accordingly.

The outlook type library seems to use the C double also, but comtypes does not know that
a date/time is meant.  In COM, date/time is represented as double, in days since 30. Dec 1899.
In comtypes\automation is code to do the conversion from/to VARIANT instances, from what I see
there you should be able to do the conversion yourself with code like this:

import datetime
_com_null_date = datetime.datetime(1899, 12, 30, 0, 0, 0)

def double_to_datetime(days):
    "Takes a COM date/time value, a float, and returns a datetime object"
    return datetime.timedelta(days=days) + _com_null_date

Thomas



More information about the Python-win32 mailing list