Using pywin32, what is the difference between Dispatch and DispatchEx?
打开时,例如使用 pywin32 的电子表格,我找到了两个选项:
1 2 |
excel1 = win32com. client. DispatchEx ( 'Excel.Application' ) wb = excel1. Workbooks. Open ( 'myxls.xls' ) |
或者我可以做到
1 2 |
excel2 = win32com. client. Dispatch ( 'Excel.Application' ) wb = excel2. Workbooks. Open ( 'myxls.xls' ) |
我想知道这是否有什么不同。文档字符串对我也没有多大帮助:
1 2 3 4 5 6 7 |
>>> w32. Dispatch.__doc__ 'Creates a Dispatch based COM object.\ ' >>> w32. DispatchEx.__doc__ |
在此站点中,他们建议 DispatchEx 可能用于远程访问。
当我只是想在自己的 PC 上自动化电子表格时,我使用哪种方法有什么不同吗?
- 鉴于 DispatchEx 没有记录而 Dispatch 是,很明显你应该使用后者,除非你有充分的理由不这样做。如果你问的是一个实际问题,那就是答案。如果您想知道事情是如何在幕后工作的,那么我们可能需要查看源代码。
这取决于你想要什么。如果 Excel 已经打开,使用 dispatch 将在打开的 Excel 实例中创建一个新选项卡。如果 Excel 已经打开,使用 dispatchEx 将打开一个新的 Excel 实例。
- 我正在使用 Dispatch,它无论如何都会打开一个新的 Excel 实例。为什么?我想连接到已经打开的实例。我应该怎么做?
- 我在那里也发现了。但是查看源代码可以看到它使用了 CoCreateInstanceEx() 。对此的评论是 Create a new instance of an OLE automation server possibly on a remote machine. 也许新实例是新自动化服务器的副作用?
DispatchEx 没有记录,而 Dispatch 是,这已经暗示了实际的答案:只需使用 Dispatch ,除非您有充分的理由相信您有特殊情况。
但是,如果您想知道幕后的区别:
从 pywin32 源代码中,您可以看到 DispatchEx 尝试返回一个package好的 IDispatchEx 接口而不是 IDispatch 。 (鉴于名称,这并不奇怪。)
你可以在 MSDN 上查找 IDispatchEx ,你会发现它是
an extension of the IDispatch interface, supports features appropriate for dynamic languages such as scripting languages.
想法是,如果您要自动化的对象是动态对象(如 Python 或 Javascript 中的那种对象),而不是静态对象(如 C 或 Java 中的那种对象) ),Visual Basic 代码可以访问其动态特性——在运行时枚举、添加和删除成员等。
当然 pywin32 几乎可以做 VB 可以做的所有事情,但有时你只需要更明确一点。在这种情况下,您需要创建一个 DispatchEx ,并调用它的 DeleteMemberByName 等方法。
如果您使用 COM 来自动化,例如 Excel,那么您会希望 .Dispatch 启动应用程序的新实例,而不是干扰已经在桌面上运行的实例。
使用 DispatchEx 代替 Dispatch
- 我刚刚遇到的事情可能会与 Dispatch 出错。如果您正在编写 GUI(或任何线程)并希望在需要 com 对象实例的线程中做一些后台工作,则必须首先调用 pythoncom.CoInitialize() 否则您将得到一堆 com_errors。现在,如果您尝试使用 Dispatch 创建的对象在前台执行某些操作,而后台任务正在使用 Dispatch 创建的对象(它们将引用同一个应用程序),调用将被拒绝。 DispatchEx 通过为每个线程使用单独的实例来解决这个问题。
本文由 华域联盟 原创撰写:华域联盟 » 关于python:使用pywin32,Dispatch和DispatchEx有什么区别?
转载请保留出处和原文链接:https://www.cnhackhy.com/158229.htm