2009-06-28 5 views
5

Je voulais implémenter le serveur python com en utilisant les extensions win32com. Consommez ensuite le serveur à partir du .NET. J'ai utilisé l'exemple suivant pour implémenter le serveur com et il fonctionne sans problème mais quand j'essaie de le consommer en utilisant C# j'ai FileNotFoundException avec le message suivant "Récupération de la classe COM pour le composant avec CLSID {676E38A6-7FA7-4BFF- 9179-AE959734DEBB} a échoué en raison de l'erreur suivante: 8007007e. " . J'ai aussi posté le code C#. Je me demande si quelque chose me manque, j'apprécierais toute aide.Consommation de serveur COM Python à partir de .NET

Merci, 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

Notez l'avertissement dans le code python, pour ne pas utiliser un nouveau GUID à chaque appel. Créez un GUID seulement une fois. – gimel

+0

Le code que vous avez publié est pour l'enregistrement d'un serveur COM; Avez-vous également mis en place (et en cours d'exécution) le serveur réel? –

+0

Je pensais que l'enregistrement du serveur signifie qu'il fonctionne. Pouvez-vous me donner plus de guides. merci – Sarah

Répondre

10

Une partie du protocole indique que le serveur doit avoir un identifiant unique, stocké dans le registre de Windows. Dans notre cas, cela signifie que vous avez "enregistré" un serveur qui n'existe pas. Ainsi l'erreur (composant non trouvé).

Ainsi, il devrait être quelque chose comme ça (comme d'habitude, ce code non testé est!):

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

Ensuite, vous devez exécuter à partir de la ligne de commande (en supposant que le script est appelé HelloWorldCOM.py):

HelloWorldCOM.py --register 
HelloWorldCOM.py

Classe HelloWorld est l'implémentation réelle du serveur. Il expose une méthode (Bonjour) et un couple d'attributs, l'un des deux est en lecture seule. Avec la première commande, vous enregistrez le serveur; avec le second, vous l'exécutez et ensuite il devient disponible pour l'utilisation d'autres applications.

+0

pour exécuter le code précédent sans erreur, j'ai appelé la méthode localserver.main() au lieu de localserver.serve ('B83DD222-7750-413D-A9AD-01B37021B24B'). J'ai démarré le serveur et lui ai donné le _reg_progid_ comme argument. – Sarah

+1

'localserver.serve ('B83DD222-7750-413D-A9AD-01B37021B24B')' est presque correct. Vous devez inclure les accolades et le placer dans une liste: 'localserver.serve (['{B83DD222-7750-413D-A9AD-01B37021B24B}'])'. Fonctionne parfaitement sans cela. –

+0

Est-il possible de l'exécuter sans s'inscrire? voir ma question.:http://stackoverflow.com/questions/41975659/portable-python-com-server-using-pywin32 – Rahul

0

Vous devez exécuter Process Monitor sur votre C# Executable pour traquer le fichier qui est introuvable. Un serveur COM est juste un morceau de logiciel (une DLL ou un exécutable) qui acceptera les appels de procédure distants (RPC) à travers un protocole défini.

Questions connexes