使用 pywin32 的便携式 Python com 服务器 [英] Portable Python com server using pywin32

查看:33
本文介绍了使用 pywin32 的便携式 Python com 服务器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Is it possible to run comserver without requiring elevation.

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

For example I am able to run code from Python.TestServer (below) but it requires elevation.

Python.TestServer 代码位于:从 .NET 使用 Python COM 服务器

Python.TestServer code is at: Consuming Python COM Server from .NET

是否可以运行不需要提升的 com 服务器,以便我可以在没有管理密码的情况下运行 com 对象.

Is it possible to run com server which doesn't require elevation so that I can run com object without having Administrative password.

例如

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)

I have tried above code but it says pywintypes.com_error: (-2147221005, 'Invalid class string', None, None)

如何为本地服务器生成有效的类字符串?

how to make the valid class string for local server?

示例 vba :

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

推荐答案

可以在没有权限的情况下注册和使用类.该类必须在当前用户而不是所有用户中注册.未提供该选项,因此您必须通过在 HKCU\SOFTWARE\Classes 中编写密钥来自行注册.

It's possible to register and use a class without privileges. The class has to be registered in the current user instead of all users. The option is not provided, so you'll have to register it yourself by writing the keys in 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)

这篇关于使用 pywin32 的便携式 Python com 服务器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆