PythonCOM arbritrary vtable based interfaces
Sanjay
sanjay at jarna.com
Tue Feb 19 05:26:37 EST 2002
Mark Hammond <mhammond at skippinet.com.au> wrote in message news:<3C71E06E.5080206 at skippinet.com.au>...
> 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.
There is a sample event handler in C++ that ships with the Exchange
SDK. Its header file includes the following classes:
BEGIN_COM_MAP(CExEv)
COM_INTERFACE_ENTRY(IExEv)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IExStoreAsyncEvents)
COM_INTERFACE_ENTRY(IExStoreSyncEvents)
COM_INTERFACE_ENTRY(IExStoreSystemEvents)
END_COM_MAP()
In this example, it implements all 3 event interfaces. This seems to
handle events fine. No mention of IExternalConnection, but it is
definitely a dual interface. I *thought* I had modeled my event
handler after this c++ example and the other python examples. Thanks
for all your help so far.
Sanjay
More information about the Python-list
mailing list