Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python win32com.client.DispatchWithEvents不';t捕获事件并引发异常_Python_Com_Win32com - Fatal编程技术网

Python win32com.client.DispatchWithEvents不';t捕获事件并引发异常

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

我必须连接到COM接口(特定的实现),调用一些方法,以同步和异步的方式获得响应。粘贴代码示例时,我必须屏蔽一些特定的接口/方法名称。如果我只使用分派方法,则所有工作正常

#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页面了吧?