2

我使用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 中作为单例启动服务器,然后从另一个应用程序访问它。

谢谢!!

4

0 回答 0