How can I use an existing COM object pointer with win32com?
mhammond at skippinet.com.au
Tue Mar 18 23:12:33 CET 2003
Gary Bishop wrote:
> In my C++ extension that wraps the Microsoft Active Accessibility API
> I can get a pointer to a IWebBrowser2 COM interface from an
> IAccessible representing the browser. I'd like to hand this pointer
> back to my Python code and use it just like I would use the object I'd
> get from
> ie = DispatchWithEvents("InternetExplorer.Application", IEEvents)
> Can I do that? I don't want to create a new instance of Internet
> Explorer. I want to connect to a particular instance already running.
> I have looked for an example of "adopting" a COM pointer but haven't
> found one.
There are 2 steps you must go through:
1) Convert the C++ interface pointer to a PyObject
2) Convert this PyObject to a "nice" win32com instance
1) is a matter of calling PyCom_PyObjectFromIUnknown(), defined in
2) is really a matter of calling the functions yourself from the C++
code using the Python API - eg, PyImport_ImportModule() to get
win32com.client, PyObject_GetAttr() to get the function from the module,
and PyEval_CallObject() to make the call. (The exact names may not be
I am not sure how you hope to get DispatchWithEvents working, given that
the second param is a class object - however, I am sure you have some
plan :) Further, I suggest that (2) actually be put in Python code.
Your C++ code should do (1), then delegate to your own Python code.
This code then does (2), and anything else necessary.
More information about the Python-list