我正在尝试使用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。
我正在寻找解决这个问题的方法:
谢谢!
答案 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