0

まず、COM/OLE2 API を使用する必要があることに注意してください。これは、低レベルのものであり、C Windows コンソール プログラムに入れることができるものです。MFCが使えません。.NET を使用できません。

私の質問は:

次のコードがあるとします。

CLSID clsid;    
HRESULT hr;

hr = CLSIDFromProgID(L"InternetExplorer.Application", &clsid);
assert(SUCCEEDED(hr));

hr = CoCreateInstance(clsid,
                      NULL,
                      CLSCTX_LOCAL_SERVER,
                      IID_IDispatch,
                      (void **)&(iePtr_));
assert(SUCCEEDED(hr));

後で同じ IE のインスタンスに再接続できるように、ディスクに情報を書き込む方法はありますか? 基本的に、「iePtr_」を文字列化して、後で他のプロセスで再構成できますか?

ありがとう。

----後から追加------

私が解決しようとしているより広い問題は、AutoCAD アプリケーションを起動し、それにいくつかのデータをロードし、クライアントが対話できるように実行したままにしたいということです。後で彼は私のアプリケーションに戻ります。私は同じ AutoCAD セッションに再接続して、より多くのデータをフィードしたいと考えています。

これで、アプリケーションのメモリに IDispatch ポインタを保持できることが十分にわかりました。同じ AutoCAD プロセスとやり取りし続けることができます。それが私のフォールバックポジションです。

ただし、「ラッパー」プログラムを使用して COM を実行しています。したがって、ラッパーは一時的です。私のメイン アプリケーションはラッパーを起動し、ラッパーが通信して終了します。後続のラッパー プロセスが同じ AutoCAD プロセスに再接続できるようにしたいだけです。

ラッパーを使用する理由 動作する理由は次のとおりです。私のメイン アプリケーションは 32 ビット アプリケーションですが、64 ビット ラッパーを使用して 64 ビット AutoCAD と通信できます。64 ビットの AutoCAD と通信できるようにする必要があり、メイン アプリケーション (C++ の 50 万行以上) とラッパー プログラム (数百行) を簡単に移植できない可能性があります。

4

4 に答える 4

0

CoMarshalInterface(および関連するAPI)を使用して、ネットワーク上の別のスレッド、プロセス、または別のPCにインターフェイスをマーシャリングできます。マーシャリングプロセスが完了するまでの待機時間はわかりませんが、原則として、インターフェイスをマーシャリングしているオブジェクトが閉じられていない場合は、後でマーシャリングプロセスを完了することができます。

OLEオブジェクトを破棄し、後で「同じオブジェクト」を復元できることは、いわゆるモニカと結びついています。それらを理解できれば、OLE /COMJujuは確かに強力です。

于 2009-09-03T07:37:26.007 に答える
0

アプリケーションが実行中のオブジェクト テーブルに登録されている場合は、GetActiveObject関数を使用してアプリケーション オブジェクトへの参照を取得できます。

IUnknown *pUnknown;

hr = GetActiveObject(clsid, NULL, &pUnknown);
assert(SUCCEEDED(hr));

hr = pUnknown->QueryInterface(IID_IDispatch, (void **)&(iePtr_));
assert(SUCCEEDED(hr));
于 2009-09-03T18:27:54.653 に答える
0

ラッパー層を一時的ではなく長寿命にすることをお勧めします。これにより、3 番目のアプリケーションへの単一の参照を簡単に保持できます。

ラッパーは、クライアント コードに対して一時的なものとして表示される場合があります。ラッパーを COM シングルトンにすると、共同作成するたびに同じインスタンスが返されます。

ラッパーがクライアントの存続期間にわたって存続するようにするには、起動からシャットダウンまで参照を保持します。この参照は、他のコードに接続する必要はありません。他のすべてのコードは、シングルトンが必要になるたびに単純に作成します。

于 2010-03-12T00:23:37.393 に答える
-1

いいえ、それは不可能です。COM の全体的な考え方は、COM サーバーが透過的に開始され、そのオブジェクトの使用を停止するまで状態のみを保持するということです。COM オブジェクトを解放した後、COM サブシステムは自由にサーバーを完全に停止でき、同じプロセスを再作成する方法はありません。同様の結果が得られる唯一の方法は、状態をストリームに保存し、ストリームから復元できるシリアル化メソッドを持つ COM オブジェクトを使用することです。ただし、その場合でも、CoCreateInstance() を再度実行し、新しい COM オブジェクト インターフェイス ポインターを取得して、そのオブジェクトの復元メソッドを呼び出す必要があります。

CoCreateInstance から取得したポインターは、現在のプロセスに対してのみ有効です。ディスクに保存して後で復元すると、無効になります。

于 2009-09-03T04:35:55.010 に答える