不带类型库的python IDispatch客户端

2024-05-16 13:30:45 发布

您现在位置:Python中文网/ 问答频道 /正文

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

尝试使用win32com包对我来说失败了,因为当没有可用的类型信息时,win32com会回退到假定任何属性访问都是property get或set时,永远不会调用方法。在

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

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

win32com试图获取服务器上的someServerMethod属性,完全忽略arg1和arg2。深入研究代码似乎是因为python正在调用self.\uugetattr_uwhich没有arg1,arg2。在

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

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

谢谢!在


Tags: 文件方法文档服务器comclient类型属性
2条回答

你应该能够使用

c._make_method_("someServerMethod")

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

一个可能的解决方案(我目前正在实现)是包装win32的用法com.客户端使用一个代理,该代理使用某种逻辑为每个方法调用调用调用“make”方法。使用here中的代码配方,我将每个不以get_u或set_u开头的属性改为method(只是一个例子,任何允许区分方法属性的启发式方法都可以)。在

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

相关问题 更多 >