2

Python comサーバーを実装し、py2exeツールを使用して実行可能ファイルとdllを生成しました。次に、zippy32.exeを使用してdllを登録しました。登録が成功したというメッセージが表示されました。次に、.NETでそのdllへの参照を追加しようとしました。dllの場所を参照して選択しましたが、次のようなエラーメッセージボックスが表示されました:dllへの参照を追加できませんでした。ファイルにアクセスでき、有効なアセンブリまたはCOMコンポーネントであることを確認してください。サーバーのコードとセットアップスクリプトを以下に追加します。サーバーをPythonスクリプトとして実行し、遅延バインディングを使用して.netからサーバーを使用できることを述べておきます。私が見逃している、または間違っていることはありますか?助けていただければ幸いです。

ありがとう、サラ

hello.py

import pythoncom

import sys

class HelloWorld:

    #pythoncom.frozen = 1
    if hasattr(sys, 'importers'):
        _reg_class_spec_ = "__main__.HelloWorld" 
    _reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER
    _reg_clsid_ = pythoncom.CreateGuid()
    _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
        print "Hello" + " " * self.softspace + str(who)
        return "Hello" + " " * self.softspace + str(who)


if __name__=='__main__':
    import sys
    if hasattr(sys, 'importers'):

        # running as packed executable.

        if '--register' in sys.argv[1:] or '--unregister' in sys.argv[1:]:

            # --register and --unregister work as usual
            import win32com.server.register
            win32com.server.register.UseCommandLine(HelloWorld)
        else:

            # start the server.
            from win32com.server import localserver
            localserver.main()
    else:

        import win32com.server.register
        win32com.server.register.UseCommandLine(HelloWorld) 

setup.py

from distutils.core import setup
import py2exe

setup(com_server = ["hello"])
4

3 に答える 3

2

私は私の質問に答えて、誰かが同様の質問をするのを助けるようにします. それが役立つことを願っています。.NET(およびVisual-Studio)にはTLBを備えたCOMサーバーが必要なため、COMタブでサーバーが見つかりません。しかし、Python の COM サーバーには TLB がありません。したがって、.NET からサーバーを使用するには (C# とレイト バインディング)。次のコードは、これを行う方法を示しています。

// C# コード

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

        }
    }
}   `
于 2009-07-20T07:25:19.850 に答える
2

この線:

_reg_clsid_ = pythoncom.CreateGuid()

このファイルが呼び出されるたびに新しい GUID を作成します。コマンド ラインで GUID を作成できます。

C:\>python -c "import pythoncom; print pythoncom.CreateGuid()"
{C86B66C2-408E-46EA-845E-71626F94D965}

次に、行を変更します。

_reg_clsid_ = "{C86B66C2-408E-46EA-845E-71626F94D965}"

この変更を行った後、コードを実行して、次の VBScript でテストすることができました。

Set obj = CreateObject("Python.TestServer")   
MsgBox obj.Hello("foo")

これで「参照の追加」の問題が解決するかどうかを確認するのに便利なMSVCがありません。

于 2009-07-05T21:45:35.733 に答える
0

登録済みのComオブジェクトを使用する場合は、[参照の追加] ダイアログ ボックスの [Com] タブでそのオブジェクトを見つける必要があります。dll に移動しません。

于 2009-07-05T12:38:44.297 に答える