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 <[EMAIL PROTECTED]> 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@python.org
http://mail.python.org/mailman/listinfo/python-win32

Reply via email to