win32com.client.Dispatch有效,win32com.client.GetActiveObject无效

2024-06-25 05:54:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Python2.7.9,Windows7

总体目标是:让另一个应用程序访问我们的自定义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却变得疯狂

按姓名发送似乎表明注册成功了

我还可以在regedit中验证什么

谢谢

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”(在idle、pythonwin和cmdline中可以正常工作),但从IE/Chrome应用程序调用时不执行com服务器(尽管其他python函数,如文件写入,也可以正常工作)

另外,鉴于我对此所知甚少,我建议使用更好的方法来实现这一点:以单例的形式启动python服务器,然后从另一个应用程序访问它

谢谢


Tags: 服务器名称com应用程序serverregwin32comguid