使用pywin32的便携式Python com服务器

使用pywin32的便携式Python com服务器,python,vb.net,vba,winapi,pywin32,Python,Vb.net,Vba,Winapi,Pywin32,是否可以在不需要提升的情况下运行comserver 例如,我可以从Python.TestServer(如下)运行代码,但它需要提升 Python.TestServer代码位于: 是否可以运行不需要提升的com服务器,这样我就可以在没有管理密码的情况下运行com对象 比如说 import pythoncom from win32com.server import localserver class demoObj(object): _reg_clsctx_ = pythoncom.CLS

是否可以在不需要提升的情况下运行comserver

例如,我可以从Python.TestServer(如下)运行代码,但它需要提升

Python.TestServer代码位于:

是否可以运行不需要提升的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\u错误:(-2147221005,“无效的类字符串”,无,无)

如何为本地服务器创建有效的类字符串

示例vba:

Sub demodemo()
    Set obj = CreateObject("Python.Demo")
    Debug.Print obj.Hello("World")
End Sub

可以在没有特权的情况下注册和使用类。类必须在当前用户而不是所有用户中注册。 该选项未提供,因此您必须通过在
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)

Com服务器将由VBA使用。你对vba有什么问题?出于好奇,你想做什么?我知道在vba中,还有其他链接excel和Python的方法。您是否尝试过xlwings?很抱歉,因为我正在度假,所以未能及时回复!我想将python用于Microsoft Word,而不是excel。我尝试了
将xlwings作为xw导入;serve()
但我不知道如何从vba(word)使用它。看起来很有效。对不起,我来晚了。我在度假