MFCATL サンプル : MFC サーバーでの ATL COM オブジェクトの使用
更新 : 2007 年 11 月
MFCATL サンプルでは、MFC サーバー EXE で ATL COM オブジェクトを使用する方法を示します。
このサーバーでは、次の 2 つのオブジェクトを作成できます。MFC で実装され、ディスパッチ インターフェイスをサポートする ObjectOne、および ATL で実装され、デュアル インターフェイスをサポートする ObjectTwo です。
セキュリティに関するメモ : |
---|
このサンプル コードは概念を示す目的で提供されているものです。必ずしも最も安全なコーディング手法に従っているわけではないので、アプリケーションまたは Web サイトでは使用しないでください。Microsoft は、サンプル コードが意図しない目的で使用された場合に、付随的または間接的な損害について責任を負いません。 |
サンプルとそのインストール手順を取得するには
Visual Studio で、[ヘルプ] メニューの [サンプル] をクリックします。
詳細については、「サンプル ファイルの格納場所」を参照してください。
使用できるサンプルの最新バージョンと完全な一覧については、オンラインの Visual Studio 2008 Samples のページを参照してください。
サンプルは、コンピュータのハード ディスク上にもあります。既定では、サンプルおよび Readme ファイルは、\Program Files\Visual Studio 9.0\Samples\ の下のフォルダにコピーされます。Visual Studio Express Edition の場合、すべてのサンプルはオンライン上にあります。
サンプルのビルドと実行
サンプルをビルドして実行するには
ソリューション ファイル mfcatl.sln を開きます。
[ビルド] メニューの [ソリューションのビルド] をクリックします。
[デバッグ] メニューの [デバッグなしで開始] をクリックします。mfcatl.exe サーバーがスタンドアロンで実行され、登録されます。
Web ブラウザで mfcatl.htm ファイルを開き、ボタンをクリックして適切なオブジェクトを呼び出します。各オブジェクトを個別に呼び出すことも、両方を同時に呼び出すこともできます。
変換に関する注意事項
当初は、両方の MFCATL オブジェクトが MFC で実装されていました。どちらも CCmdTarget の派生オブジェクトでした。ObjectTwo は ATL を使用して、次の手順で再実装されました。
ATL ヘッダー ファイル (Atlbase.h と Atlcom.h) を Premfcat.h にインクルードします。
Atlimpl.cpp を Premfcat.cpp にインクルードします。
BEEPER EXE サンプルと同様に、CComModule の派生クラスを Prefcat.h に追加します。この派生クラスは、Lock メソッドと Unlock メソッドを実装して、AfxOleLockApp と AfxOleUnlockApp を呼び出すことによりロック カウントを MFC に転送します。
オブジェクト マップ マクロのペア (BEGIN_OBJECT_MAP と END_OBJECT_MAP) を Mfcatl.cpp に追加し、_Module という名前のモジュール クラスの静的インスタンスを追加します。
_Module.Init と Term を InitInstance と ExitInstance から呼び出します。
typelib をリソースとして追加します。
_Module.RegisterServer(TRUE) を InitInstance から呼び出します。これは、COleObjectFactory::UpdateRegistryAll への MFC 呼び出しに相当します。
_Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE) 呼び出します。これは、IMPLEMENT_OLECREATE マクロで暗黙に行ったように、MFC のクラス ファクトリの REGCLS_MULTIPLEUSE に相当します。
次の手順を実行して、ATL で ObjectTwo を再実装します。
ODL ファイルをディスパッチ インターフェイスからデュアル インターフェイスに変更します。
ODL コンパイルで、ATL に必要なヘッダー ファイル (Interf.h) を生成します。
.h ファイルと .cpp ファイルを書き直します。最も簡単な方法は、ATL ウィザードを実行して、自動的に生成されたコードを元の MFC コードにコピーして貼り付け、名前を変更する方法です。
OBJECT_ENTRY(CLSID_ObjectTwo, CObjectTwo) を ATL オブジェクト マップに追加します。
このサンプルにはありませんが、場合によっては、次に示す変換手順も必要です。
IDL 形式への ODL ファイルの移植
コマンド ライン引数 -RegServer と -UnregServer のサポートの追加
キーワード
このサンプルでは、次のキーワードを使用します。
AfxMessageBox; AfxOleInit; AfxOleLockApp; AfxOleUnlockApp; ASSERT; BEGIN_COM_MAP; CCmdTarget; CCmdTarget::OnFinalRelease; CComCoClass; CComModule; CComModule::GetLockCount; CComModule::Lock; CComModule::Unlock; CComObjectRoot; CDialog; CMenu::AppendMenu; COleObjectFactory::RegisterAll; COleObjectFactory::UpdateRegistryAll; COM_INTERFACE_ENTRY; CString::IsEmpty; CString::LoadString; CWindow::GetSystemMenu; DECLARE_DYNCREATE; DECLARE_NOT_AGGREGATABLE; DECLARE_REGISTRY; DestroyWindow; EnableAutomation; GetClientRect; GetSystemMetrics; IDispatchImpl; PostMessage; SendMessage; SetIcon; ShowWindow; SysAllocString