我使用python 2.7.9,Windows 7 ...
总体目标:让另一个应用程序访问我们的自定义 com 服务器(此时已在运行)并向其发送要显示的消息。显然,需要有一个服务器,多个客户端。
我试图使用一些自定义代码作为 com 服务器。该类被创建为:
class StatusServerClass:
_public_methods_ = ...
_reg_progid_ = "CseStatusServerLib.CseStatusServer"
_reg_verprogid_ = "CseStatusServerLib.CseStatusServer"
_reg_progid_ = "CseStatusServerLib.CseStatusServer"
_reg_clsid_ = "{<GUID here>}"
_reg_desc_ = 'CSE Status Server'
_typelib_guid_ = "{<typelib GUID here>}"
_typelib_version_ = 1, 0 # Version 1.0
_reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER
_reg_threading_ = "Apartment" # Not used?
def __init__.....
并使用以下方式注册:
win32com.server.register.UseCommandLine(StatusServerClass)
我可以在 regedit 中看到它,据我所知,它看起来还可以。GUID 是正确的,名称是正确的。
现在当我去使用它时,它工作得很好:
self.StatusClient = Dispatch('CseStatusServerLib.CseStatusServer')
但是当我想从另一个exe(甚至另一个用于调试的python窗口)附加到正在运行的实例时,使用:
win32com.client.GetActiveObject("CseStatusServerLib.CseStatusServer")
它只是给了我:
dispatch = pythoncom.GetActiveObject(resultCLSID)
com_error: (-2147221021, 'Operation unavailable', None, None)
告诉我它没有注册?
我尝试使用 GUID,我尝试使用带有 ID 和 GUID 的 pythoncom.GetObject ......没有运气。
我试过 comtypes 包并得到同样的东西。
关于我做错了什么的任何想法?为什么 Dispatch 按名称找到它,而 GetActiveObject 却生气了?
似乎 Dispatch 按名称工作会表明注册有效?
我还能在注册表中验证什么?
谢谢!!!
2016 年 6 月 6 日更新
如果您还没有意识到,我对此知之甚少。但我已经读过,为了使 win32com.client.GetActiveObject() 工作,服务器需要位于“运行对象表”中......而它不是。
所以,我发现了一些我用来注册类的示例代码:
import win32com.server.util
wrapped = win32com.server.util.wrap(StatusServerClass)
flags = pythoncom.REGCLS_MULTIPLEUSE|pythoncom.REGCLS_SUSPENDED
handle = pythoncom.RegisterActiveObject(wrapped,
StatusServerClass._reg_clsid_,flags)
这确实允许服务器显示在运行对象表中,我可以得到这个:
testSW = win32com.client.GetActiveObject("CseStatusServerLib.CseStatusServer")
没有错误地返回。
所以现在,我可以在 python、pythonWin 中很好地使用 Dispatch 或 GetActiveObject,甚至可以在 Excel/VB <-> python 中与服务器交互,它似乎共享命名空间。
但是......我仍然无法让这个基于 IE 的第三方应用程序使用现有的服务器......即使使用 GetActiveObject。总是想创建新实例并使用它自己的命名空间......不好
IE 或 Chrome 是否存在会阻止使用现有服务器的东西?同样,它在 Excel/VB 中运行良好。该应用程序应该执行“python myscript.py”(在空闲、pythonwin 和 cmdline 中工作正常),但在从 IE/Chrome 应用程序调用时不执行 com 服务器的东西(尽管文件写入等其他 python 函数工作正常) .
此外,鉴于我对此知之甚少,无论如何,建议一种更好的方法:在 python 中作为单例启动服务器,然后从另一个应用程序访问它。
谢谢!!