質問

既存のアプリケーションを RTDサーバー.

このアプリケーションは現在 C++ で書かれており、最終的には C#/Mono に移植する予定ですが、C++ で RTD 機能を追加できるようにしたいと考えています。

コードのサンプル部分 (MSVCRTDServer) とこのサイトをいくつか見つけました。 http://weblogs.asp.net/kennykerr/archive/2008/10/29/excel-rtd-server-in-c.aspx

残念ながら、これらは DLL であり、私はずっと前に COM (Good Ridance) について知っていたことをすべて忘れてしまいました。

DLL サンプルを EXE に組み込むにはどうすればよいですか?これは明らかに、COM サーバーを DLL ではなく EXE にパッケージ化することに関するものです。

編集:

既存のアプリには MFC GUI があることに注意してください。

編集:

使用目的は既存の GUI アプリを実行することです。COM/RTD インターフェイスのクライアントがアプリを起動する必要はありません。(それが良いことは否定しませんが)

基本的に、Excel (または他のアプリ) がアプリケーションが提供する動的データにアクセスできるように、独自のデータを使用して IRTDServer インターフェイスを実装したいと考えています。(これはシリアルポートデバイスと通信するプログラムです - そのデバイスには変化するステータス/状態があり、その変化についてクライアントを非同期的に更新できるようにしたいです)

したがって、COM オブジェクトを作成して登録し、クライアントがそれを「見る」ことができるようにする必要があります。

COM オブジェクトを exe に追加し、その COM オブジェクトに既存の/事前定義されたインターフェイスを実装させる方法がわかりません。

編集コードサンプルを取得できるように、これについて賞金を始めました。どうやら私はあまりにも怠惰で愚かなので(あるいは、単にCOMに対する過度の嫌悪感があるだけかもしれません)、Franci Penovによる既存の回答から始めることができません。(これは非常に便利で、素晴らしいスタートです)

したがって、基本的に私が探しているものは次のとおりです。

多数のスレッドが実行されている既存のダイアログ ベースの MFC アプリケーションを取得し、それを RTD サーバー (同じ UI を持つ) に変えるコード

共同作成するすべてのものと CoThisandthat など。そのコードを実行ファイルのどこに入れればよいでしょうか?IRTD のものを拡張/実装するにはどうすればよいですか?

サンプル MFC hello world アプリ (ダイアログ ベース) の前後で、受け入れられた回答が得られます。

  1. mfc ダイアログ アプリのすべてのソース コードを含むアプリの前。
  2. 「後」アプリは、RTD サーバー インターフェイスとそのすべてのソースを実装する、手順 1 の MFC アプリに基づいています。(すべてのプロジェクト ファイル、ソースなど)
  3. GUI/ビジュアルスタジオで実行する手順、またはステップ 1 からステップ 2 を作成する手順。( IDL などのその他のファイルが作成されます。)

理想的には、これは VS2008 用に提供されますが、どのバージョンでも機能します。

ありがとう。

役に立ちましたか?

解決

編集: おい、私は 2000 年以来 MFC に触れていない。私は残りの人生もそうありたいと願っていました。:-) ともかく...

どうやら、魔法使いは前世紀から進化しているようです。MFC アプリに ATL COM サポートを追加する次の手順は、VS 2008 用です。

  1. MFCTest という単純な MFC ダイアログ ベースのアプリを生成します。 しないでください ウィザードの「自動化」チェックボックスをオンにします。
  2. プロジェクトを右クリックし、「追加/クラス...」を選択します。ダイアログで、[ATL シンプル オブジェクト] を選択します。ATL サポートがプロジェクトに追加されるという警告が表示されます。
  3. 新しいウィザードが開き、新しい ATL オブジェクトのオプションが表示されます。

もう終わりです。

率直に言って、ウィザードで生成されたコードをここに投稿する理由は見当たりません。ただし、そのコードの特定の部分についてさらに質問がある場合は、SO に投稿してください。お手伝いします。


編集: 徐々に記事化していきます。このまま行けば本も出版できるかも知れません。:-)

単純な ATL オブジェクトを MFC プロジェクトに統合したら、それに RTD インターフェイスを追加できます。インターフェイスから継承することと、それをインターフェイスに追加することの両方が必要になります。 COM_INTERFACE_MAP. 。RTD インターフェースは IDispatch インターフェイスを使用するには、IDispatchImpl<> からクラスを継承し、IDispatch を COM_INTERFACE_MAP を使用して COM_INTERFACE_ENTRY2 (それが実装されていることを指定するため) IRtdServer.

RTD がどのように機能するのかよくわかりません。必要な場合もあります COM 接続ポイントのサポートを追加 Excel が更新をサブスクライブする必要がある場合は、クラスに送信します。更新するためのリンクもあります ATL の接続ポイント 知識。

ところで、私はこのブログ投稿を偶然見つけました。 2 つの RTD インターフェイスの C++ 定義. 。おそらくすでにお持ちだと思いますが、完全を期すために追加しておきたいと思います。


最も簡単な方法は、VS ウィザードを使用して新しい ATL EXE プロジェクトを作成し、登録とプロセス管理の部分をそれに任せることです。残りはそれほど変わりません。

COM の世界へのプロセス外への再出発に特定のサンプルが必要な場合は、以下を参照してください。 ラブラドール.

さらに興味のあるリンクがいくつかあります:

編集: COM を使用して EXE 内のオブジェクトを登録し、クライアント アプリが CocreateInstance できるようにする方法を知りたいだけの場合は、次を確認してください。 CoRegisterClassObject. 。しかし:

  • オブジェクトはCOMオブジェクトである必要があります
  • クラスファクトリーを実装する必要があります
  • プロセス管理が必要な場合 (つまり、COM がオンデマンドでアプリを起動する)、ClassID をレジストリに登録する必要があります。
  • クライアントが ProgID を使用して作成する場合は、ProgID をレジストリに登録する必要があります。
  • カスタム マーシャリングを行っている場合は、カスタム プロキシ/スタブ DLL が必要になる場合があります。
  • アプリに UI がある場合は、ユーザーが UI を閉じても、オブジェクトへの最後の COM 参照が解放されるまでアプリが終了しないように、シャットダウン ロジックを変更する必要があります。

編集2: 操作のシーケンスを理解するために、ATL の out-of-proc サンプルと ATL ウィザードが生成するスケルトンを参照することをお勧めします。ただし、正確に何が起こっているのかを確認するには、ATL コードを少し詳しく調べる必要がある場合があります。

プロセスの短いバージョンは次のとおりです。

起動時に、アプリケーションは特定のコマンドライン引数を確認する必要があります。 /埋め込み. 。その引数が存在する場合、アプリが CoCO 呼び出しに応答して COm によって起動されていることを意味します。アプリはこの時点で UI を表示しないことを選択する場合があります。

アプリが UI を表示するかどうかに関係なく、アプリは、上で説明した CoRegisterClassObject API を通じて提供する COM オブジェクトのクラス ファクトリを登録する必要があります。

アプリが COM 経由で起動された場合、最後の COM リファレンス リリースでアプリ自体をシャットダウンすることを選択できます。(これは通常、オブジェクトの AddRef で増加し、オブジェクトの Release で減少する追加のグローバル参照カウンターを通じて検出されます)。ただし、ユーザーが UI を操作したことを検出した場合、アプリ自体をシャットダウンすべきではありません。このような場合、ユーザーが最後の UI を明示的に閉じるまでシャットダウンは延期されます (検出を容易にするために、通常、アプリはユーザーが明示的に開始しようとするまで UI を表示しません)。

アプリがユーザーによって起動され、最後の UI が閉じられている場合、アプリはその中のオブジェクトへの未解決の COM 参照があるかどうかを確認する必要があります。何もない場合は、自動的にシャットダウンする可能性があります。ただし、COM 参照がある場合、アプリは UI を非表示にしますが、最後の参照が解放されるまで実行を継続します。

アプリがシャットダウンする時点に達した場合、すべてのクラス ファクトリ登録を取り消す必要があります。

他のヒント

あなたは、ATL Serverプロジェクトにコードをマーシャリング。 でサンプルを参照してください。

scroll top