[python-win32] Accessing other interfaces of a Dispatch created COM object

Alec Munro alecmunro at gmail.com
Fri Aug 29 19:47:49 CEST 2008


Thanks Mark.

After a couple of misfires, I think I figured out how to get CastTo to
work (the docstring is practically non-existent in the version I have,
perhaps it's been updated?).

However, that puts me back at the same place I was with some of the
other attempts:

>>> obj_i2 = CastTo(obj, "Interface_2")
>>> obj_i2.secondaryMethod()
Traceback (most recent call last):
...
 File "C:\Python25\lib\site-packages\win32com\client\__init__.py",
line 449, in _ApplyTypes_
   dispid, 0, wFlags, retType, argTypes, *args),
com_error: (-2147319779, 'Library not registered.', None, None)

However, one interesting note is that the object generated by CastTo
is of a different version of the Type Library than the object
generated by Interface_2(obj). I don't know if that's useful
information, however. They have the same CLSID, but different
coclass_clsids.

Thanks again,

Alec

On Fri, Aug 29, 2008 at 3:01 AM, Mark Hammond <mhammond at skippinet.com.au> wrote:
> Look at the docstring for win32com.client.CastTo (and googling for that will
> probably help too)
>
> Cheers,
>
> Mark
>
>> I just discovered a third possibility, and subsequent failure:
>>
>> >>> obj_i2 = Dispatch(obj, None, Interface_2.CLSID)
>> >>> obj_i2.secondaryMethod()
>> Traceback (most recent call last):
>> ...
>>   File "C:\Python25\lib\site-packages\win32com\client\__init__.py",
>> line 449, in _ApplyTypes_
>>     dispid, 0, wFlags, retType, argTypes, *args),
>> com_error: (-2147352573, 'Member not found.', None, None)
>>
>> Alec
>>
>> On Thu, Aug 28, 2008 at 10:33 AM, Alec Munro <alecmunro at gmail.com>
>> wrote:
>> > Oh, and on re-reading, I do realize that the DLL itself doesn't
>> > implement those interfaces. There's a class within the DLL that does
>> > that. :)
>> >
>> > On Thu, Aug 28, 2008 at 10:32 AM, Alec Munro <alecmunro at gmail.com>
>> wrote:
>> >> Hi List,
>> >>
>> >> Hopefully I have my terminology right, I'm pretty new to COM and
>> C++.
>> >>
>> >> My problem is that I have a COM DLL written in C++, that I would
>> like
>> >> to call from Python. This DLL implements 3 important interfaces,
>> each
>> >> of which is also an IDispatch implementation, like the following:
>> >>
>> >> IDispatchImpl<Interface_1, &__uuidof(Interface_1),
>> &LIBID_Interface_1, 1, 0>
>> >> IDispatchImpl<Interface_2, &__uuidof(Interface_2),
>> &LIBID_Interface_2, 1, 0>
>> >> IDispatchImpl<Interface_3, &__uuidof(Interface_3),
>> &LIBID_Interface_3 1, 0>
>> >>
>> >>  However, when I do:
>> >>>>> obj = win32com.client.Dispatch("a.b.c")
>> >>>>> obj
>> >> <COMObject a.b.c>
>> >>
>> >> The object I get only has methods available for the first of the
>> >> interfaces. From my reading, this is simply the functionality of
>> >> IDispatch, and if I wanted to get those additional methods through
>> >> IDispatch, I would have to update the DLL, and restructure my
>> >> interfaces. I'm not confident enough in my C++ to do this, or at
>> least
>> >> it's not my first choice.
>> >>
>> >> From what I've read, there are two ways that seem to be
>> possibilities
>> >> for being able to call the methods from the other interfaces.
>> >>
>> >> The simplest one I found was the suggestion to use MakePy on the
>> type
>> >> library containing Interface_2 and Interface_3. I did this, and
>> copied
>> >> the generated file to my working directory, then did:
>> >>
>> >>>>> from interfaces import Interface_2
>> >>>>> obj_i2 = Interface_2(obj)
>> >>>>> obj_i2
>> >> <win32com.gen_py.typelibname 1.0 Type Library.Interface_2 instance
>> at
>> >> 0x17459602>
>> >>
>> >> Unfortunately when I try:
>> >>
>> >>>>> obj_i2.secondaryMethod()
>> >> Traceback (most recent call last):
>> >> ...
>> >>  File "C:\Python25\lib\site-packages\win32com\client\__init__.py",
>> >> line 449, in _ApplyTypes_
>> >>   dispid, 0, wFlags, retType, argTypes, *args),
>> >> com_error: (-2147319779, 'Library not registered.', None, None)
>> >>
>> >> The other suggestion I came across was to use QueryInterface. I
>> wasn't
>> >> sure what argument to pass to QueryInterface, so I tried using the
>> >> CLSID of the interface I wanted.
>> >>
>> >>>>> obj._oleobj_.QueryInterface(Interface_2.CLSID)
>> >> Traceback (most recent call last):
>> >>  File "<interactive input>", line 1, in <module>
>> >> TypeError: There is no interface object registered that supports
>> this IID
>> >>
>> >> From these error messages, it seems like perhaps there's a problem
>> >> with the registration of the type library that contains the
>> >> interfaces. I'm not really sure how to fix that, or if that is even
>> >> the problem.
>> >>
>> >> Any ideas?
>> >>
>> >> Thanks,
>> >> Alec Munro
>> >>
>> >
>> _______________________________________________
>> python-win32 mailing list
>> python-win32 at python.org
>> http://mail.python.org/mailman/listinfo/python-win32
>
>


More information about the python-win32 mailing list