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

Alec Munro alecmunro at gmail.com
Thu Aug 28 16:34:18 CEST 2008


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
>>
>


More information about the python-win32 mailing list