2017-02-01 90 views
11

Yükseltici gerektirmeden comserver çalıştırmak mümkün mü? Örneğin, Python.TestServer (aşağıdan) kodunu çalıştırabilirim ancak yükseltme gerektiriyor. Consuming Python COM Server from .NETPywin32 kullanarak taşınabilir Python com sunucusu

mümkün ben İdari şifresini kalmadan com nesnesini çalıştırmak böylece yükselme gerektirmez com sunucusu çalıştırmak mı:

Python.TestServer kodu yer almaktadır. Örneğin

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') 

kod yukarıda denedim ama pywintypes.com_error: (-2147221005, 'Invalid class string', None, None)

ne kadar yerel sunucu için geçerli sınıf dizesi yapmak söylüyor için

?

Örnek vba:

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

Com sunucu VBA tarafından tüketilen edilecektir:

İşte çalışan bir örnek. VBA ile sorunun nedir? – Rahul

+0

Merak etme, ne yapmaya çalışıyorsun? Ben vba excel ve python – Kelvin

+0

xlwings denediniz var alternatifleri vardır biliyorum? – denfromufa

cevap

7

Bu kayıt ve ayrıcalıkları olmayan bir sınıf kullanmak mümkündür. Sınıf, tüm kullanıcılar yerine mevcut kullanıcıya kaydedilmelidir. Bu seçenek sağlanmıyor, bu nedenle HKCU\SOFTWARE\Classes numaralı telefonu yazarak kendiniz kaydetmeniz gerekiyor.

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

Çalışma gibi görünüyor. Cevap için geç kaldığım için üzgünüm. Tatildeydim – Rahul