win32com.client.DispatchWithEvents不捕获事件并引发异常

时间:2014-07-16 12:33:43

标签: python com win32com

我必须连接到COM接口(具体实现),调用一些方法,以同步和异步方式获取响应。在粘贴代码示例时,我不得不屏蔽一些特定的接口/方法名称。如果我只使用调度方法,那么一切正常

#works fine in synchronous mode
myObj = win32com.client.Dispatch(myObjID)
myObj.MyMethod1(0)
myResp = myObj.myMethod2()
print "property1: " + myResp.property1 #works fine

当我需要获取某些事件时,问题就开始了( DispatchWithEvents )。它导致Python崩溃!抛出低级网络异常: exceptions.EOFError:[Errno 10054]远程主机强行关闭现有连接。代码示例导致崩溃:

#crashing code
class SomeEvents(object):
    def OnMethod1(self):
        print 'OnMethod1'

myObj = win32com.client.DispatchWithEvents(myObjID,SomeEvents)
myObj.MyMethod1(0) # CRASH OCCURS HERE!

我已经检查过Dispatch和DispatchWithEvents实际返回了什么类型的对象:

Dispatch 返回的对象:

<win32com.gen_py.myComInterface 1.0 Type Library.myComManager instance at 0x20508304>
['CLSID', 'MyMethod1', 'MyMethod2', 'MyMethod3', 'MyMethod4', 'MyMethod5', '_ApplyTypes_', '__doc__', '__eq__', '__getattr__', '__init__', '__iter__', '__module__', '__ne__', '__repr__', '__setattr__', '_get_good_object_', '_get_good_single_object_', '_oleobj_', '_prop_map_get_', '_prop_map_put_', 'coclass_clsid']

DispatchWithEvents 返回的对象:

<win32com.client.COMEventClass instance at 0x20462352>
['__del__', '__doc__', '__getattr__', '__init__', '__module__', '__setattr__', '_obj_']

在这两种情况下都返回了不同类型的对象。 DispatchWithEvents 返回的对象是 COMEventClass ,它不包含MyMethod1,MyMethod2等(这是崩溃的原因吗?我希望“对象没有属性”异常)

我还尝试通过创建2个不同的对象来实现它。因此,没有崩溃,也没有捕获事件。代码示例:

#doesn't crash but also doesn't catch any events
class SomeEvents(object):
    def OnMethod1(self):
        print 'OnMethod1'

myObj1 = win32com.client.Dispatch(myObjID)
myObj2 = win32com.client.DispatchWithEvents(myObjID,SomeEvents)
myObj1.MyMethod1(0) 
myResp = myObj1.MyMethod2()
print "property1: " + str(myResp.property1) #property displayed correctly
#no 'OnMethod1' printout visible

我正在使用互联网上的示例实现COM客户端。 Python版本:WinXP SP3上的2.7.6(32位)。我无法搜索任何类似的问题(让我感到惊讶的是一点点)。我究竟做错了什么?也许COM的具体实现有bug?我认为下一步将是使用VB实现COM客户端并检查它是否有类似的问题。你会建议什么?

1 个答案:

答案 0 :(得分:1)

尝试通过DispatchWithEvents连接到Excel并触发一些事件(在线查看excel互操作文档)并查看您的听众是否获得了这些事件。如果可行,则COM对象出现问题,或者您可能必须生成类型库。您可以先将对象与EnsureDispatch一起使用,然后只需执行此操作即可。之后,看看是否使用DispatchWithEvents您的Python obj仍然缺少MyMethod1等。如果没有,并且Excel(或任何其他生产质量的COM服务器,如Word或IE)COM实例事件工作,那么那里必须是你的COM对象有问题。