PythonCOM arbritrary vtable based interfaces

Mark Hammond mhammond at skippinet.com.au
Tue Feb 19 00:17:48 EST 2002


Sanjay wrote:
> Mark Hammond <mhammond at skippinet.com.au> wrote in message news:<3C6DAF39.5080808 at skippinet.com.au>...
> 
>>Sanjay wrote:
>>
>>>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
>>>my application.
>>>
>>>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 
>>type library.
>>
>>Mark.
>>
> 
> 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.

Mark.




More information about the Python-list mailing list