【问题标题】:Is there an equivalent of WScript.ConnectObject in python?python中是否有等效的WScript.ConnectObject?
【发布时间】:2016-05-26 12:33:41
【问题描述】:

我正在使用win32com 在python 中重新实现一个简单的WSH 脚本与COM 对象(“CANalyzer.Application”,如果你必须知道的话)进行交互。我在脚本调用 ConnectObject 方法以将其处理程序绑定到 COM 对象事件时被阻止:

Set App = CreateObject("CANalyzer.Application")
Set Measurement = App.Measurement
Wscript.ConnectObject Measurement, "Measurement_"

Sub Measurement_OnInit()
  Set TestFunction = App.CAPL.GetFunction("f")
End Sub

这个处理程序似乎是我可以合法调用GetFunction的唯一时刻,在处理程序之外调用它要么没有预期的效果,要么抛出异常:

pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2147418113), None)

在 python 中是否有等效的 ConnectObject 可以用来绑定到 OnInit() 事件?

【问题讨论】:

  • 查看win32com.client.DispatchWithEvents
  • @JacobSeleznev 谢谢,这真的很有帮助。我希望我能找到一些win32com 的在线文档并避免提出基本问题,但在谷歌上搜索DispatchWithEvents win32com python 只会产生指向 SO 和邮件列表的链接。

标签: python python-3.x com win32com wsh


【解决方案1】:

感谢@JacobSeleznev 我发现了DispatchWithEvents() 方法:

class ApplicationEvents(object):
    def OnQuit(self):
        print("quitting")

app = win32com.client.DispatchWithEvents("CANalyzer.Application", ApplicationEvents)

还有一个WithEvents() 方法,当在Dispatch() 已经被调用后应该有条件地启用事件处理时,该方法很有用:

app = win32com.client.Dispatch("CANalyzer.Application")
win32com.client.WithEvents(app, ApplicationEvents)

最后说明:为了真正调度事件,需要不断调用pythoncom.PumpWaitingMessages(),直到所有事件都处理完毕。

【讨论】:

    猜你喜欢
    • 2018-05-03
    • 2013-02-04
    • 2012-11-21
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 2012-08-26
    • 2019-08-19
    相关资源
    最近更新 更多