2009-06-28 24 views
5

私は、win32com拡張を使用してpython comサーバーを実装したかったのです。 その後、.NET内からサーバーを使用します。 次の例を使用してcomサーバーを実装しましたが、問題なく実行しますが、C#を使用してそれを消費しようとすると、次のメッセージでFileNotFoundExceptionが発生しました」CLSID {676E38A6-7FA7-4BFF- 9179-AE959734DEBB}が次のエラーのため失敗しました:8007007e " 。私はC#コードも投稿しました。私が何かを見逃しているのであれば、何か助けていただければ幸いです。.NETからのPython COMサーバーの使用

おかげで、 サラ

#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

Pythonコードでは警告し、すべての呼び出しで新しいGUIDを使用しないように注意してください。一度だけGUIDを作成します。 – gimel

+0

投稿したコードは、COMサーバーを登録するためのものです。実際のサーバーも実装していますか? –

+0

私はサーバーの登録が実行中であることを意味します。あなたは私に多くのガイドを教えてくれますか? ありがとう – Sarah

答えて

10

COMサーバーは、定義されたプロトコルを通じてリモートプロシージャコール(RPC)を受け入れるソフトウェア(DLLまたは実行可能ファイル)の1つです。プロトコルの一部は、サーバーがWindowsのレジストリに格納されている一意のIDを持っている必要があることを示しています。 このケースでは、これは、既存のサーバーが「登録済み」であることを意味します。したがって、エラー(コンポーネントが見つかりません)。

だから、それはこの(いつものように、これは未テストコードです!)のようなものでなければなりません:

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

次にあなたが(スクリプトがHelloWorldCOM.pyと呼ばれていると仮定した場合)、コマンドラインから実行する必要があります。

HelloWorldCOM.py --register 
HelloWorldCOM.py

クラスHelloWorldは、サーバーの実際の実装です。 1つのメソッド(Hello)と2つの属性を公開し、2つのうちの一方は読み取り専用です。 最初のコマンドを使用して、サーバーを登録します。もう1つは実行し、他のアプリケーションから使用できるようになります。

+0

エラーなしで上記のコードを実行するにはlocalserver.serve( 'B83DD222-7750-413D-A9AD-01B37021B24B')の代わりに localserver.main()メソッドを呼び出しました。私はサーバを起動し、_reg_progid_を引数として与えました。 – Sarah

+1

'localserver.serve( 'B83DD222-7750-413D-A9AD-01B37021B24B')'がほぼ正しいです。中カッコを含めてリストに入れる必要があります: 'localserver.serve(['{B83DD222-7750-413D-A9AD-01B37021B24B'}])'。完璧に動作します。 –

+0

登録せずに実行できますか?私の質問を参照してください.http://stackoverflow.com/questions/41975659/portable-python-com-server-using-pywin32 – Rahul

0

あなたが見つからないファイルを追跡するためにあなたのC#実行可能でProcess Monitorを実行する必要があります。

関連する問題