4

全て:

一部の VBA コードを C# に変換する際に問題が発生しています。

ローカル COM サーバーとして機能するサードパーティ アプリがあります。

VBA コードでは、GetObject()を使用して既存のオブジェクトへの参照を取得します。

例えば

Set appHandle = GetObject("", ProgId)

これはうまくいきます。

C# コードにサードパーティ アプリへの参照を追加し、 Marshal.GetActiveObject()を使用して実行中のインスタンスへの参照を取得しようとしました。

例えば

var appModel = (IAppCoModel)Marshal.GetActiveObject(ProgId);

しかし、MK_E_UNAVAILABLEエラーが発生し続けます。

新しいオブジェクトの作成は、C# コードで正常に機能します

例えば

var appModel = new AppCoModel()

これにより、サードパーティのアプリが起動し、それと通信できるようになります。失敗した実行中のインスタンスへの参照を取得しているだけです。

私が試したこと

異なるセキュリティ コンテキスト
VS は管理者モードで実行されていますが、サード パーティのアプリはそうではありません。コマンドライン (非管理者) から C# アプリを実行してみました。まだ失敗しています。

ROT の内容を確認します (Marshal.GetActiveObject( )が C# で MK_E_UNAVAILABLE 例外をスロー
することを示唆) 。それが必要であることを確認するのに十分なCOMを知りません。

すべてのレジストリ エントリ
を確認しました (私が見る限り) 見栄えがよく、サード パーティ製アプリの作成とインスタンス化、および VBA がそれを見つけるのに十分です。ここで確認する必要がある具体的なことはありますか?

人々ができる提案は大歓迎です。

4

1 に答える 1

6

全て:

自分の質問を閉じるためのエチケットが何であるかはよくわかりませんが、答えを見つけたので、何らかの方法で「答えを必要としない」とマークしたいと思います。

GetActiveObject() が MK_E_UNAVAILABLE を返す理由は、サードパーティ アプリがオートメーション サーバーとして登録されていないためです。実行中のインスタンスへの参照を取得できません。

次の理由により、これは VBA コードには表示されませんでした。

  1. GetObject("",ProgID)毎回新しいインスタンスを作成します ( http://msdn.microsoft.com/en-us/library/gg251785.aspx )

  2. サードパーティ アプリの COM 公開機能は、アプリが実行されていない場合にアプリを起動します。そのため、VBA では、実行中のアプリにアタッチするのではなく、実行中の同じアプリをすべて指す複数のオブジェクトを作成しています。

于 2012-04-13T13:20:42.540 に答える