3

クライアント側の比較的複雑なアプリケーション (ActiveX / .net / Delphi / C++ / COM) を適応させて、SxS を使用して、管理者以外の展開と製品の古いバージョンからの分離を実現しています。

プロセスで使用するすべてのライブラリを記述したマニフェスト ファイルを作成することで、.net ui、Delphi ui、およびプロセスで使用する COM サーバーなど、ほぼすべてのプロセス内コンポーネントでこの目標を達成できました。登録は必要ありません。いずれかのコンポーネントのクライアントで (ほぼ)。

そして、大部分がここに来ます: 現時点では、私たちのアプリケーションは (C++ の部分から) プロセス外 ActiveX サーバー (Delphi ActiveX EXE) を呼び出し、それ自体がプロセス外 ActiveX サーバーの別のセット (サードパーティのプラグイン、ここには、Delphi、C++、ActiveX EXE プロセス外であり、インターフェイスを実装している限り、すべてのものがあります)。

私たちが知っているように、SxS はアウト プロセス ActiveX サーバーをサポートしていません。また、これらのオブジェクトをメイン プロセスの proc com サーバーのように使用することはできません。これは、アプリケーションを大幅に書き直す必要があり、最悪の場合、サード パーティのツールやベンダーによって使用される公開 API を壊す必要があるためです。許せないブレイク。

別のプロセスで実行されている Internet Explorer ウィンドウから IHTMLDocument2 を抽出する方法について説明しているこの記事に出くわしましたこのアプローチを思いついた理由は次のとおりです。

ActiveX をイン プロセス サーバーとして実行するセカンダリ サテライト アプリケーション/プロセスを作成します。次に、 LresultFromObjectObjectFromLresultを使用して、ActiveX オブジェクトの参照をサテライト アプリケーションからメイン アプリケーション プロセスに転送します。サテライト アプリケーションには、SxS モードで実行できる独自のマニフェスト ファイルがあります。

この Delphi ActiveX EXE とサード パーティの AciveX EXE プラグインとの間の通信には、同じアプローチが取られます。

com リクエストを .net に変換することにより、.net リモーティングと .net com プロキシ クラスを使用して 2 つのプロセス間の通信チャネルを開くという上記の提案されたソリューションよりも、当面は好まない代替ソリューションがあります。 2 番目のプロセスで com に戻ります。

だからここに質問があります:

  1. このアプローチについてどう思いますか?
  2. 問題のより良い解決策はありますか?
4

2 に答える 2

4

することが可能です。必要なもの:

  • アプリケーションは、COM に依存するのではなく、サーバー自体を起動する必要があります。レジストリによって提供される追加の間接化は必要ありません。CreateProcess() を使用するだけです。
  • サーバーは、そのクラス ファクトリをその main() メソッドで CoRegisterClassObject() に登録する必要があります。
  • 重要: 各ファクトリに使用する CLSID は、サービス インスタンスごとに一意になるように変更する必要があります。これにより、クライアントが正しいサーバーに接続することが保証されます。プロセス ID とクラス ファクトリの CLSID を XOR するだけです。クライアントはプロセス ID も知っているので、同じ変更を加えることができます。
  • アプリケーションは、Sleep() 呼び出しを含むループで CoCreateInstance() を呼び出して、オブジェクト ファクトリが表示されるまで待機する必要があります。少なくとも 60 秒が経過するまで失敗を宣言しないでください (それは私を苦しめました)。
  • <file>アプリケーションとサーバーの両方に、各プロキシ/スタブ DLL の<comInterfaceExternProxyStub>要素と、リモート化された各インターフェイスの要素を含むマニフェストが必要です。
于 2010-01-14T22:52:00.970 に答える
0

アレックス、

nobugz さんの言うとおりです。実行中のオブジェクト テーブルにアクセスして、現在実行中の Delphi オートメーション exe のプロセスから COM オブジェクトのインスタンスを作成できます。

しかし、私は説明できない大きな問題を発見しました。この方法で作業する場合、バリアント ディスパッチ メソッドを介してのみオブジェクトにアクセスできます。

基本的に、Active X exe が登録されていない場合、たとえばインターフェイスを介してオブジェクトをインスタンス化しようとすると、「インターフェイスがサポートされていません」というエラーが表示されます。

WebUpdate : IAutomation;

WebUpdate:= CoAutomation.Create; <-- 動かないエラー


WebUpdate : バリアント;

WebUpdate := CreateOleObject('WebUpdate.Automation'); <-- 正常に動作します

regserverを使用してアクティブなx exeを登録すると、問題はなくなります!!

ゴーフィギュア!

于 2010-03-23T23:13:31.040 に答える