没有类型库的python IDispatch客户端

时间:2012-05-08 10:16:01

标签: python automation win32com idispatch typelib

我正在尝试使用Python一个COM服务器,它只公开IDispatch接口,既没有IDL文件也没有类型库。我确实有不同方法的文档以及如何使用它们。

尝试使用win32com包失败了,因为似乎没有类型信息可用win32com回退假设任何属性访问属性get或set,而不是方法调用。

也就是说,当我执行以下操作时:

  import win32com.client
  c = win32com.client.GetActiveObject(server_progid)
  c.someServerMethod(arg1, arg2)

win32com尝试在服务器上获取 someServerMethod 属性,完全忽略arg1,arg2。挖掘代码似乎是因为python正在调用self .__ getattr__,它没有arg1,arg2。

我正在寻找解决这个问题的方法:

  • 告诉win32com的一些语法我实际上是在调用方法;
  • 其他一些实际实现此行为的python COM客户端;
  • 其他建议,除了显而易见的“手动将文档转换为类型库”。

谢谢!

2 个答案:

答案 0 :(得分:0)

你应该可以使用

c._make_method_("someServerMethod")

告诉win32com将其视为方法而不是属性。

答案 1 :(得分:0)

一个可能的解决方案(我目前正在实现)是使用代理调用 win32com.client 的用法,该代理使用某种逻辑为每个方法调用调用_make_method_。使用here中的代码配方,我将每个不以get_或set_开头的属性更改为方法(只是一个例子,任何允许从方法中告诉属性的启发式方法都会这样做。)

import new
from types import MethodType

class Proxy(object):

    def __init__(self, target):
        self._target = target

    def __getattr__(self, aname):
        target = self._target
        ### Beginning of special logic ###
        if aname[:4]!='set_' and aname[:4]!='get_':
        ### End of special logic ###
            # Rebind the method to the target.
            return new.instancemethod(f.im_func, self, target.__class__)
        else:
            return f