2017-02-01 22 views
11

高度を必要とせずにcomserverを実行することは可能ですか?pywin32を使用する移植可能なPython comサーバー

たとえば、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)

どのように言いましたか?

例VBA:

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

はここで働い例です。 vbaのあなたの問題は何ですか? – Rahul

+0

好奇心を要して、何をしようとしていますか?私はvbaでExcelとPythonをリンクする他の選択肢があることを知っています – Kelvin

+0

あなたはxlwingsを試しましたか? – denfromufa

答えて

7

それは権限なしでクラスを登録して使用することが可能です。クラスは、すべてのユーザーではなく現在のユーザーに登録する必要があります。 オプションは提供されていませんので、HKCU\SOFTWARE\Classesに鍵を書き込んで自分で登録する必要があります。 COMサーバーは、VBAで消費される

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) 
+0

働いているようです。返事が遅れるのは残念です。私は休暇中でした – Rahul

関連する問題