[python-win32] Problem: methods defined in type library's base class are not accessible in inherited class objects of the type library

Tim Roberts timr at probo.com
Fri Feb 19 17:19:52 EST 2016


Indranil Sinharoy via python-win32 wrote:
>
> I am a relatively new user of pywin32 package, but not Python. I have
> an application (written in C/#, as I understand) that provides a COM
> interface for using with other languages such as Python. I am using
> the pywin32 library to communicate with the application and it works
> fairly well. However, I am facing a particular kind of problem. The
> problem is that the application exposes some interface objects that
> inherit from other base objects but the methods defined in the base
> class objects doesn't seem to be accessible to the child class object.
> Is this type of behavior is atypical with pywin32? 

I'm wondering about your terminology, and I may have misunderstood your
situation.  If you are given a COM interface, you can access the methods
of that interface, or you can query for another COM interface from the
same object.  You certainly cannot access the non-COM methods of the
underlying object.  There is simply no generic way to find those
methods, because they are implemented differently in different
languages.  That's why COM was invented -- it is language-independent.

Also remember that, even though YOU know there is an object underneath,
that's secret knowledge.  All you are supposed to know about is a COM
interface -- a set of functions.  You can't rely on anything else, and
you aren't supposed to know about parent/child relationships.

Now, if you are talking about asking an interface to return you another
interface from the same object, then the CastTo method you are using is
exactly right:


> class MyBaseClass:
>     ...
>     ...
>     def my_parent_method(self):
>         base = win32com.client.CastTo(self, 'MyParentClass')
>         return base.my_parent_method()
>     ...

That's a fairly efficient operation.  It just calls QueryInterface.


> Although this strategy works, I would like to find out if there is a
> more efficient/ automatic way of resolving this  issue.  In my
> particular case, there are a large number of such objects (that
> inherit from some base class without access to the methods defined in
> the parent class) provided by the application and I would like to
> avoid re-writing all the methods for all such objects.

To a certain extent, this represents a design flaw in the objects you
are invoking.  When you have a lot of COM interfaces, each with a few
methods, you end up doing an awful lot of QueryInterface calls.

-- 
Tim Roberts, timr at probo.com
Providenza & Boekelheide, Inc.



More information about the python-win32 mailing list