在运行LocalServer32的Python COM Server中使用OLE Automation中的IPictureDisp对象

时间:2019-01-29 12:31:16

标签: python com pywin32

我正在尝试设置一个没有管理员权限的COM服务器,因此我可以运行一个与Python解释器通信的Word加载项。当我在本地服务器上运行IPictureDisp对象给python时,会出现问题。

将外接程序注册为InProcServer32是可以的,但是我发现将外接程序注册为InProcServer的代码需要提升权限(管理员权限)。由于我需要此程序才能在没有管理员权限的情况下运行,因此我使用以下解决方案将COM作为localserver运行。

def RegisterClass(cls):
    file = 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")

但是,当运行本地服务器而不是为IPictureDisp对象获取COM对象时,我从Word中收到一条消息,提示“自动化错误:灾难性故障”。

是否可以仅以当前用户身份(无管理员)运行InProcServer或使IPictureDisp对象在LocalServer32上工作?

0 个答案:

没有答案