1

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

尝试使用 win32com 包对我来说失败了,因为似乎当没有可用的类型信息时 win32com 回退到假设任何属性访问是属性获取或设置,而不是方法调用。

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

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

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

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

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

谢谢!

4

2 回答 2

0

你应该可以使用

c._make_method_("someServerMethod")

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

于 2012-05-08T15:07:57.700 回答
0

一个可能的解决方案(我目前正在实施)是将win32com.client的使用与一个代理包装起来,该代理使用一些逻辑为每个方法调用调用 _make_method_ 。使用此处的代码配方,我更改为方法每个不以 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
于 2012-05-09T11:44:05.363 回答