python - पोर्टेबल पायथन कॉम सर्वर pywin32 का उपयोग कर



vb.net vba (1)

क्या उन्नयन की आवश्यकता के बिना कॉमसेंवर को चलाने के लिए संभव है?

उदाहरण के लिए मैं Python.TestServer (नीचे) से कोड चलाने में सक्षम हूं, लेकिन उसे ऊंचाई की आवश्यकता है I

Python.TestServer कोड है: नेट से पायथन कॉम सर्वर का उपभोग

क्या कॉम सर्वर को चलाना संभव है, जिसकी उन्नयन की आवश्यकता नहीं है ताकि मैं प्रशासनिक पासवर्ड के बिना कॉम ऑब्जेक्ट चला सकूँ

उदाहरण के लिए

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) कहता है pywintypes.com_error: (-2147221005, 'Invalid class string', None, None)

स्थानीय सर्वर के लिए वैध क्लास स्ट्रिंग कैसे करें?

उदाहरण 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 = 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