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

时间:2016-06-03 00:53:16

标签: win32com dispatch comtypes pythoncom

我正在使用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)

我可以在注册表中看到它,据我所知,它看起来还不错。 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&lt; - &gt;中与服务器交互。 python,它似乎共享namespsace。

... BUT 我仍然无法使用这个基于IE的第三方应用程序来使用现有服务器...即使使用GetActiveObject。总是想创建新实例并使用自己的命名空间......不好

IE或Chrome是否会阻止现有服务器的使用?再次,它在Excel / VB中工作正常。该应用程序应该执行“python myscript.py”(在idle,pythonwin和cmdline中工作正常),但是从IE / Chrome App调用时不会执行com服务器的东西(尽管其他python函数,如文件编写工作正常)

另外,通过各种方式,看看我对此知之甚少,建议一种更好的方法:在python中将服务器作为单例启动,然后从另一个应用程序访问它。

谢谢!

0 个答案:

没有答案