PythonCOM arbritrary vtable based interfaces
mhammond at skippinet.com.au
Tue Feb 19 00:17:48 EST 2002
> Mark Hammond <mhammond at skippinet.com.au> wrote in message news:<3C6DAF39.5080808 at skippinet.com.au>...
>>>What I am trying to do is something that was somewhat discussed on a
>>>previous thread, but I'm not sure the thought was fully completed.
>>>Specifically, I would like to write an exchange server event sink by
>>>implementing two com interfaces, IExStoreAsyncEvents and
>>>IExStoreSyncEvents. The problem I'm having is that when the python
>>>event listener is loaded as a com+ application, and I register this
>>>application for events with exchange, I get the error TypeError ...
>>>IID not supported. From looking at the previous threads, it seems as
>>>this problem is caused by not being able to handle arbitrary vtable
>>>interfaces, such as the interface methods of IExStoreAsyncEvents and
>>>IExStoreSyncEvents. If, however, the two com classes
>>>IExStoreAsyncEvents and IExStoreSyncEvents were defined in a pyd, then
>>>pythoncom would have knowledge of these interfaces, and properly call
>>>I hope I'm explaining the problem clearly. I am a little confused as
>>>to how to get around this with pythoncom.
>>You need t6o check out the win32com\servers\test_pycomtest.py. This
>>shows how arbitary vtables must be loaded by your code before it is
>>recognized. This in-turn implies that the interface is described in a
> Ok, I looked at test_pycomtest.py and changed my interface to match,
> i.e. I set _public_methods_ to an empty list, _com_interfaces_ to
> "[IExStoreSyncEvents]", I created a new _reg_clsid_ value, and
> implemented the two methods in the interface. I then registered the
> class using register.UseCommandLine() with debugging turned on. Then
> I told Exchange to notify this object when new events happen. In the
> windows Event viewer, I now see the following error when events occur
> in Exchange and it tries to call my python com object:
> Exception: C0000005
> Address: 0x1E12E6A5
> Call Stack:
> python22!PyDict_Next + 0xC5
> ole32!StringFromCLSID + 0xB91
> There doesn't seem to be anything strange in the Python Trace
> Collector window. I see a message saying "Object with win32trace
> dispatcher created (object=None)", followed by 3 calls to
> QueryInterface with unsupported IIDs (Unregistered, ISTdMarshalInfo,
> and IExternalConnection) which are all interfaces I should not need
> implemented here.
> Any idea what the problem is?
It could be IExternalConnection - this is often necessary to support
events. See the various "connect.py" files in the win32com tree for
some insights into how events are usually hooked up.
Do you have sample C++ code that works in this environment. If so, you
should be able to see exactly what is necessary to implement.
More information about the Python-list