使用 pywin32 的便携式 Python com 服务器
Portable Python com server using pywin32
是否可以 运行 comserver 而无需提升。
例如,我可以 运行 来自 Python.TestServer(下方)的代码,但它需要提升。
Python.TestServer 代码位于:Consuming Python COM Server from .NET
是否可以 运行 不需要提升权限的 com 服务器,这样我就可以 运行 com 对象而无需管理密码。
例如
import pythoncom
from win32com.server import localserver
class demoObj(object):
_reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER
_reg_clsid_ = "{FA501660-8BB0-42F6-842B-A757FA3098DC}"
_reg_desc_ = "Demo COM server"
_reg_progid_ = "Python.Demo"
_public_methods_ = ['hello']
def hello(self, who):
return "Hellow " + who
localserver.serve('B83DD222-7750-413D-A9AD-01B37021B24B')
我试过上面的代码,但它说 pywintypes.com_error: (-2147221005, 'Invalid class string', None, None)
如何为本地服务器创建有效的 class 字符串?
示例vba:
Sub demodemo()
Set obj = CreateObject("Python.Demo")
Debug.Print obj.Hello("World")
End Sub
可以在没有特权的情况下注册和使用 class。 class 必须在当前用户而不是所有用户中注册。
未提供该选项,因此您必须通过在 HKCU\SOFTWARE\Classes
.
中编写密钥来自行注册
这是一个工作示例:
import os, sys, win32api, win32con, win32com.server.register
class HelloWorld(object):
_reg_progid_ = "Python.TestServer"
_reg_clsid_ = "{7CC9F362-486D-11D1-BB48-0000E838A65F}"
_reg_desc_ = "Python Test COM Server"
_public_methods_ = ['Hello']
def Hello(self):
return "Hello!"
def RegisterClass(cls):
file = os.path.abspath(sys.modules[cls.__module__].__file__)
folder = os.path.dirname(file)
module = os.path.splitext(os.path.basename(file))[0]
python = win32com.server.register._find_localserver_exe(1)
python = win32api.GetShortPathName(python)
server = win32com.server.register._find_localserver_module()
command = '%s "%s" %s' % (python, server, cls._reg_clsid_)
typename = module + "." + cls.__name__
def write(path, value):
win32api.RegSetValue(win32con.HKEY_CURRENT_USER, path, win32con.REG_SZ, value)
write("SOFTWARE\Classes\" + cls._reg_progid_ + '\CLSID', cls._reg_clsid_)
write("SOFTWARE\Classes\AppID\" + cls._reg_clsid_, cls._reg_progid_)
write("SOFTWARE\Classes\CLSID\" + cls._reg_clsid_, cls._reg_desc_)
write("SOFTWARE\Classes\CLSID\" + cls._reg_clsid_ + '\LocalServer32', command)
write("SOFTWARE\Classes\CLSID\" + cls._reg_clsid_ + '\ProgID', cls._reg_progid_)
write("SOFTWARE\Classes\CLSID\" + cls._reg_clsid_ + '\PythonCOMPath', folder)
write("SOFTWARE\Classes\CLSID\" + cls._reg_clsid_ + '\PythonCOM', typename)
write("SOFTWARE\Classes\CLSID\" + cls._reg_clsid_ + '\Debugging', "0")
print("Registered %s" % cls.__name__)
if __name__ == '__main__':
RegisterClass(HelloWorld)
是否可以 运行 comserver 而无需提升。
例如,我可以 运行 来自 Python.TestServer(下方)的代码,但它需要提升。
Python.TestServer 代码位于:Consuming Python COM Server from .NET
是否可以 运行 不需要提升权限的 com 服务器,这样我就可以 运行 com 对象而无需管理密码。
例如
import pythoncom
from win32com.server import localserver
class demoObj(object):
_reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER
_reg_clsid_ = "{FA501660-8BB0-42F6-842B-A757FA3098DC}"
_reg_desc_ = "Demo COM server"
_reg_progid_ = "Python.Demo"
_public_methods_ = ['hello']
def hello(self, who):
return "Hellow " + who
localserver.serve('B83DD222-7750-413D-A9AD-01B37021B24B')
我试过上面的代码,但它说 pywintypes.com_error: (-2147221005, 'Invalid class string', None, None)
如何为本地服务器创建有效的 class 字符串?
示例vba:
Sub demodemo()
Set obj = CreateObject("Python.Demo")
Debug.Print obj.Hello("World")
End Sub
可以在没有特权的情况下注册和使用 class。 class 必须在当前用户而不是所有用户中注册。
未提供该选项,因此您必须通过在 HKCU\SOFTWARE\Classes
.
这是一个工作示例:
import os, sys, win32api, win32con, win32com.server.register
class HelloWorld(object):
_reg_progid_ = "Python.TestServer"
_reg_clsid_ = "{7CC9F362-486D-11D1-BB48-0000E838A65F}"
_reg_desc_ = "Python Test COM Server"
_public_methods_ = ['Hello']
def Hello(self):
return "Hello!"
def RegisterClass(cls):
file = os.path.abspath(sys.modules[cls.__module__].__file__)
folder = os.path.dirname(file)
module = os.path.splitext(os.path.basename(file))[0]
python = win32com.server.register._find_localserver_exe(1)
python = win32api.GetShortPathName(python)
server = win32com.server.register._find_localserver_module()
command = '%s "%s" %s' % (python, server, cls._reg_clsid_)
typename = module + "." + cls.__name__
def write(path, value):
win32api.RegSetValue(win32con.HKEY_CURRENT_USER, path, win32con.REG_SZ, value)
write("SOFTWARE\Classes\" + cls._reg_progid_ + '\CLSID', cls._reg_clsid_)
write("SOFTWARE\Classes\AppID\" + cls._reg_clsid_, cls._reg_progid_)
write("SOFTWARE\Classes\CLSID\" + cls._reg_clsid_, cls._reg_desc_)
write("SOFTWARE\Classes\CLSID\" + cls._reg_clsid_ + '\LocalServer32', command)
write("SOFTWARE\Classes\CLSID\" + cls._reg_clsid_ + '\ProgID', cls._reg_progid_)
write("SOFTWARE\Classes\CLSID\" + cls._reg_clsid_ + '\PythonCOMPath', folder)
write("SOFTWARE\Classes\CLSID\" + cls._reg_clsid_ + '\PythonCOM', typename)
write("SOFTWARE\Classes\CLSID\" + cls._reg_clsid_ + '\Debugging', "0")
print("Registered %s" % cls.__name__)
if __name__ == '__main__':
RegisterClass(HelloWorld)