Python win32com.client.DispatchWithEvents不';t捕获事件并引发异常
我必须连接到COM接口(特定的实现),调用一些方法,以同步和异步的方式获得响应。粘贴代码示例时,我必须屏蔽一些特定的接口/方法名称。如果我只使用分派方法,则所有工作正常:Python win32com.client.DispatchWithEvents不';t捕获事件并引发异常,python,com,win32com,Python,Com,Win32com,我必须连接到COM接口(特定的实现),调用一些方法,以同步和异步的方式获得响应。粘贴代码示例时,我必须屏蔽一些特定的接口/方法名称。如果我只使用分派方法,则所有工作正常: #works fine in synchronous mode myObj = win32com.client.Dispatch(myObjID) myObj.MyMethod1(0) myResp = myObj.myMethod2() print "property1: " + myResp.property1 #work
#works fine in synchronous mode
myObj = win32com.client.Dispatch(myObjID)
myObj.MyMethod1(0)
myResp = myObj.myMethod2()
print "property1: " + myResp.property1 #works fine
<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']
<win32com.client.COMEventClass instance at 0x20462352>
['__del__', '__doc__', '__getattr__', '__init__', '__module__', '__setattr__', '_obj_']
当我需要获取一些事件(DispatchWithEvents)时,问题开始出现。它导致Python崩溃!引发低级网络异常:异常。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实际返回的对象类型:
调度返回的对象:
#works fine in synchronous mode
myObj = win32com.client.Dispatch(myObjID)
myObj.MyMethod1(0)
myResp = myObj.myMethod2()
print "property1: " + myResp.property1 #works fine
<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']
<win32com.client.COMEventClass instance at 0x20462352>
['__del__', '__doc__', '__getattr__', '__init__', '__module__', '__setattr__', '_obj_']
我使用互联网上的示例实现COM客户端。Python版本:WinXP SP3上的2.7.6(32位)。我找不到任何类似的问题(这让我有点吃惊)。我做错了什么?也许COM的特定实现存在bug?我认为下一步将是使用VB实现COM客户端,并检查它是否存在类似的问题。您有什么建议?尝试通过
DispatchWithEvents
连接到Excel,并触发一些事件(在线查看Excel interop文档),查看您的侦听器是否获得这些事件。如果这样做有效,那么COM对象有问题,或者您可能必须生成类型库。您可以先将对象与EnsureDispatch
一起使用,只需执行一次即可。之后,查看是否使用DispatchWithEvents
您的Python对象仍然缺少MyMethod1
等。如果没有,并且Excel(或任何其他生产质量COM服务器,如Word或IE)COM实例事件正常工作,则您的COM对象一定有问题 谢谢你的提示。我试过了,但我的脚本还是失败了。我成功地从Internet Explorer COM对象接收事件。我还怀疑COM对象可能有问题。我同意,这是目前唯一合理的结论。我想你已经读过MSDN页面了吧?