2009-06-28 8 views
5

Chciałem zaimplementować serwer python com przy użyciu rozszerzeń win32com. Następnie skonsumuj serwer z .NET. Użyłem następującego przykładu, aby zaimplementować serwer com i działa on bez problemu, ale kiedy próbuję go użyć używając C#, otrzymałem FileNotFoundException z następującym komunikatem "Pobieranie fabryki klasy COM dla komponentu z CLSID {676E38A6-7FA7-4BFF- 9179-AE959734DEBB} nie powiodło się z powodu następującego błędu: 8007007e. " . Wysłałem również kod C#. Zastanawiam się, czy czegoś brakuje. Byłbym wdzięczny za pomoc.Konsumpcja serwera COM Python z .NET

Dzięki, Sarah

#PythonCOMServer.py 

import pythoncom 
class PythonUtilities: 
    _public_methods_ = [ 'SplitString' ] 
    _reg_progid_ = "PythonDemos.Utilities" 
    # NEVER copy the following ID 

    # Use"print pythoncom.CreateGuid()" to make a new one. 
    _reg_clsid_ = pythoncom.CreateGuid() 
    print _reg_clsid_ 
    def SplitString(self, val, item=None): 
     import string 
     if item != None: item = str(item) 
     return string.split(str(val), item) 

# Add code so that when this script is run by 
# Python.exe,.it self-registers. 

if __name__=='__main__':   
    print 'Registering Com Server' 
    import win32com.server.register 
    win32com.server.register.UseCommandLine(PythonUtilities) 


// the C# code 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Reflection; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

       Type pythonServer; 
       object pythonObject; 
       pythonServer = Type.GetTypeFromProgID("PythonDemos.Utilities"); 
       pythonObject = Activator.CreateInstance(pythonServer); 

     } 
    } 
} 
+1

Uwaga ostrzeżenie w kodzie Pythona, aby nie używać nowego identyfikatora GUID dla każdego połączenia. Utwórz identyfikator GUID tylko jeden raz. – gimel

+0

Kod, który wysłałeś, służy do rejestracji serwera COM; czy zaimplementowałeś (i uruchomiłeś) aktualny serwer? –

+0

Myślałem, że rejestracja serwera oznacza, że ​​działa. Czy możesz dać mi więcej przewodników. dzięki – Sarah

Odpowiedz

10

Serwer COM to tylko część oprogramowania (biblioteka DLL lub plik wykonywalny), która będzie akceptować zdalne wywołania procedur (RPC) za pośrednictwem zdefiniowanego protokołu. Część protokołu mówi, że serwer musi mieć unikalny identyfikator przechowywany w rejestrze systemu Windows. W naszym przypadku oznacza to, że zarejestrowałeś serwer, który nie istnieje. Tak więc błąd (komponent nie został znaleziony).

więc powinno być coś takiego (jak zwykle, jest to kod nieprzetestowanych!):

import pythoncom 

class HelloWorld: 
    _reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER 
    _reg_clsid_ = "{B83DD222-7750-413D-A9AD-01B37021B24B}" 
    _reg_desc_ = "Python Test COM Server" 
    _reg_progid_ = "Python.TestServer" 
    _public_methods_ = ['Hello'] 
    _public_attrs_ = ['softspace', 'noCalls'] 
    _readonly_attrs_ = ['noCalls'] 

    def __init__(self): 
     self.softspace = 1 
     self.noCalls = 0 

    def Hello(self, who): 
     self.noCalls = self.noCalls + 1 
     # insert "softspace" number of spaces 
     return "Hello" + " " * self.softspace + str(who) 

if __name__ == '__main__': 
    if '--register' in sys.argv[1:] or '--unregister' in sys.argv[1:]: 
     import win32com.server.register 
     win32com.server.register.UseCommandLine(HelloWorld) 
    else: 
     # start the server. 
     from win32com.server import localserver 
     localserver.serve('B83DD222-7750-413D-A9AD-01B37021B24B') 

Następnie należy uruchomić z wiersza poleceń (zakładając, że skrypt jest wywoływany HelloWorldCOM.py):

HelloWorldCOM.py --register 
HelloWorldCOM.py

Klasa HelloWorld jest faktyczną implementacją serwera. Wykazuje jedną metodę (Hello) i kilka atrybutów, jeden z nich jest tylko do odczytu. Za pomocą pierwszego polecenia rejestrujesz serwer; z drugim uruchomisz go, a następnie stanie się dostępny do użycia z innych aplikacji.

+0

w celu uruchomienia poprzedniego kodu bez błędu, nazwałem metodę localserver.main() zamiast localserver.serve ('B83DD222-7750-413D-A9AD-01B37021B24B'). Uruchomiłem serwer i nadałem mu argument _reg_progid_ jako argument. – Sarah

+1

'localserver.serve ('B83DD222-7750-413D-A9AD-01B37021B24B')' jest prawie poprawne. Musisz dodać nawiasy klamrowe i umieścić je na liście: 'localserver.serve (['{B83DD222-7750-413D-A9AD-01B37021B24B}'])'. Działa bezbłędnie inaczej. –

+0

Czy można go uruchomić bez rejestracji? zobacz moje pytanie.:http://stackoverflow.com/questions/41975659/portable-python-com-server-using-pywin32 – Rahul

0

Trzeba uruchomić Process Monitor na C# wykonywalny do wyśledzić plik nie został znaleziony.

Powiązane problemy