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

Alec Munro alecmunro at gmail.com
Tue Sep 2 18:44:02 CEST 2008


I'm guessing, based on the lack of responses, and the consistency of
error messages, that my problem has more to do with getting the right
library registered, which isn't a python-win job.

So, can anyone recommend where I might go to try to solve this
problem? Also, is there a way to determine which library it is that is
not registered?

Thanks again,

Alec

On Fri, Aug 29, 2008 at 2:47 PM, Alec Munro <alecmunro at gmail.com> wrote:
> 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