Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

List all methods in COMobject

Is it possible?

Something in the lines of :

import win32com.client
ProgID = "someProgramID"
com_object = win32com.client.Dispatch(ProgID)

for methods in com_object:
    print methods

I got the com_object.__dict__, which lists:

[_oleobj_, _lazydata_, _olerepr_, _unicode_to_string_, _enum_, _username_, _mapCachedItems_, _builtMethods_]

Most are empty, except:

  • _oleobj_ (PyIDispatch)
  • _lazydata_ (PyITypeInfo)
  • _olerepr_ (LazyDispatchItem instance)
  • _username_ (<unknown>)

But I don't know how to access anything on those types.

like image 569
f.rodrigues Avatar asked Dec 09 '14 02:12

f.rodrigues


People also ask

How do I see all methods in Python?

To list the methods for this class, one approach is to use the dir() function in Python. The dir() function will return all functions and properties of the class.

What is COMObject Python?

<COMObject Word..Application.> This object is an example of a dynamic dispatch object. The provided name indicates that the object is a generic COM object, and affirms that Python doesn't know anything about it, except the name that you used to create it. All the information about this object is built dynamically.


2 Answers

For those who find the accepted answer not working (look here for the reasons) - there's still a way to get objects having a _prop_map_get_ attribute (a dict that holds object's fields as keys). You just have to create the main app object with win32com.client.gencache.EnsureDispatch().

Here's a convenience function I wrote that lists fields and methods of a passed COM object created that way:

from inspect import getmembers


def print_members(obj, obj_name="placeholder_name"):
    """Print members of given COM object"""
    try:
        fields = list(obj._prop_map_get_.keys())
    except AttributeError:
        print("Object has no attribute '_prop_map_get_'")
        print("Check if the initial COM object was created with"
              "'win32com.client.gencache.EnsureDispatch()'")
        raise
    methods = [m[0] for m in getmembers(obj) if (not m[0].startswith("_")
                                                 and "clsid" not in m[0].lower())]

    if len(fields) + len(methods) > 0:
        print("Members of '{}' ({}):".format(obj_name, obj))
    else:
        raise ValueError("Object has no members to print")

    print("\tFields:")
    if fields:
        for field in fields:
            print(f"\t\t{field}")
    else:
        print("\t\tObject has no fields to print")

    print("\tMethods:")
    if methods:
        for method in methods:
            print(f"\t\t{method}")
    else:
        print("\t\tObject has no methods to print")

For an Excel object created with win32com.client.gencache.EnsureDispatch("Excel.Application") its output would be:

Members of 'Excel.Application' (Microsoft Excel):
    Fields:
        ActiveCell
        ActiveChart
        ActiveDialog
        ActiveEncryptionSession
        ...
        Workbooks
        WorksheetFunction
        Worksheets
        _Default
    Methods:
        ActivateMicrosoftApp
        AddChartAutoFormat
        AddCustomList
        Calculate
        ...
        Union
        Volatile
        Wait
like image 189
z33k Avatar answered Sep 21 '22 13:09

z33k


Just found how to get most of the methods:

Here's how:

import win32com.client
import pythoncom

ProgID = "someProgramID"
com_object = win32com.client.Dispatch(ProgID)

for key in dir(com_object):
    method = getattr(com_object,key)
    if str(type(method)) == "<type 'instance'>":
        print key
        for sub_method in dir(method):
            if not sub_method.startswith("_") and not "clsid" in sub_method.lower():
                print "\t"+sub_method
    else:
        print "\t",method

Here's a exemple output with ProgID = "Foobar2000.Application.0.7"

Output:

Playlists
    Add
    GetSortedTracks
    GetTracks
    Item
    Load
    Move
    Remove
    Save
Name
    foobar2000 v1.1.13
ApplicationPath
    C:\Program Files (x86)\foobar2000\foobar2000.exe
MediaLibrary
    GetSortedTracks
    GetTracks
    Rescan
Minimized
    True
Playback
    FormatTitle
    FormatTitleEx
    Next
    Pause
    Previous
    Random
    Seek
    SeekRelative
    Start
    Stop
ProfilePath
    file://C:\Users\user\AppData\Roaming\foobar2000
like image 45
f.rodrigues Avatar answered Sep 21 '22 13:09

f.rodrigues