0

COMオブジェクトを理解していないか、混乱を招きます。私は頻繁に'作成'、'ディスパッチ'COMオブジェクト-PythonまたはVB(Obj = win32com.client.Dispatch('Visum.Visum')またはObj = CreateObject("Excel.Application")それぞれ)のいずれかで。それは簡単で、明白で、すべてがうまくいきます。しかし、どうすればよいですか:a)すでに実行されているCOMオブジェクトに接続するb)COMオブジェクトである実行中のプロセスのリストを取得する

  • VBでは、参照と追加情報は何ですか:CreateObjectコマンド。Pythonでは、これは明確に定義された包括的なライブラリの一部ですwin32comが、VBでは、参照なしの単一のメソッドです:http: //msdn.microsoft.com/en-us/library/7t9k08y5 (v=vs.80).aspx

非常に紛らわしい(COMオブジェクト、サーバー?接続、ディスパッチ、登録??)

Rafali2を明確にしてくれてありがとう

4

2 に答える 2

2

まず、COMの良い紹介を読むことをお勧めします。個人的には、ドン・ボックスの「エッセンシャルCOM」がCOMに関する最高の本だと思います。それで数時間を費やすと、後で何時間も節約できます。

そうは言っても、あなたの質問に移りましょう。

a)VBから既存のCOMオブジェクトを取得するには、関数を呼び出す必要がありGetObjectます。これは、RunningObjectTableに登録されているCOMオブジェクトに対してのみ機能します。Excelがこれを行うので、問題はないはずです。

b)ハンス・パッサントが正しく指摘したように、この質問は意味がありません。プロセスとCOMオブジェクトは、プロセスがCOMオブジェクトをホストするという事実を除いて、完全に無関係なものです。これは、「どのプロセスがクラスXのインスタンスであるか」を尋ねるのと似ています。ただし、プロセスはCOMオブジェクト(またはそれらの多く)をホストできます。これらのオブジェクトは一時的にしか存続できないので、そこで何を期待しますか?さらに、多くのCOMクラスはdll内に実装されていますが、作成されたインスタンスは明らかにプロセス内でホストされています-では、そこで何を期待しますか?

于 2012-12-11T09:51:42.897 に答える
0

COMテクノロジーは私がしばらく使用していなかったものなので、情報が間違っている可能性がある場合は申し訳ありません(とにかく、私の本「Inside COM + baseservices」を持っています!)

簡単に言えば、COMオブジェクトの簡単な定義を示しましょう。これは、次のメソッドを使用して標準インターフェイスIUnkownを公開するクラスを持つ標準DLLに他なりません。

  • AddRef:COMオブジェクトを消費するクライアントを登録します
  • リリース:クライアントの登録を解除します(通常、未使用のオブジェクトは実行を停止しますが、他のオブジェクトは常駐している可能性があります)
  • QueryInterface:関数のアドレスを取得します

QueryInterfaceは、強力な(コンパイル時にDLLを知る必要はありません)が時間がかかる関数(遅延バインディング)のアドレスを動的に取得するために使用されます。一方、これらのDLLはシステムに登録されているため、コンパイル時に関数のアドレスを直接参照できます(すべての情報はレジストリに保存されます)。

新しいオブジェクトの作成または実行中のオブジェクトのアドレスの取得は、プロキシの役割をロードおよび/または果たすRPC(リモートプロシージャコール)を介して行われます。

したがって、COMオブジェクトの新しいインスタンスを作成するには、CreateObject(VBの場合)(Co)CreateInstanceをVC ++(またはc#?)で呼び出しますが、実行中のインスタンスを取得するには、GetObject()を呼び出します。

COMオブジェクトのリストを取得するのはそれほど簡単ではありません(私はまったく不可能だと思います)。前述のように、COMオブジェクトはDLLに他なりません。これは、ライブラリが主に各プロセスのアドレス空間に読み込まれることを意味します。アクセスはプライベートです。多くのプロセス間でオブジェクトが共有されるアウトプロセスCOMオブジェクト(インプロセスの反対)の場合でも(つまり、ExcelはアウトプロセスCOMオブジェクトです:アプリケーションのアドレス空間にDLLをロードしません)、ホスト(rpc.exeまたは専用ホスト)によってロードされます

これがセルジュに役立つことを願っています

于 2012-12-10T23:37:13.100 に答える