MFCATL サンプル:ATL COM オブジェクトは、MFC のサーバーを使用してください。
MFCATL サンプルでは、MFC サーバー EXE で ATL COM オブジェクトを使用する方法を示します。
サーバーの 2 つのオブジェクトを作成をできます。ObjectOne (MFC およびサポートに dispinterfaceで実装) および ObjectTwo (で実装された ATL およびデュアル インターフェイス サポート)。
セキュリティに関するメモ |
---|
このサンプル コードは概念を示すためのものであり、その概念に関連するコードのみを示しています。特定の環境について必ずしもセキュリティ要件を満たしていませんので、そのまま使用しないでください。セキュリティおよびエラー処理コードを追加して、プロジェクトをより安全かつ堅牢にすることをお勧めします。これらのサンプル コードは、現状有姿のままで提供されるものであり、一切保証されていません。 |
サンプルとそのインストール手順を取得するには
Visual Studio のサンプルにアクセスするには
[ヘルプ] メニューの [サンプル] をクリックします。
既定では、これらのサンプルは drive:\Program Files\Microsoft Visual Studio 10.0\Samples\ にインストールされています。
サンプルのビルドと実行
サンプルをビルドして実行するには
ソリューション ファイル mfcatl.sln を開きます。
From the Build menu, click Build Solution.
メニューの [デバッグ、 デバッグなしで開始] をクリックします。 mfcatl.exe サーバーがスタンドアロンで実行され、登録されます。
Web ブラウザーで mfcatl.htm ファイルを開き、ボタンをクリックして適切なオブジェクトを呼び出します。 各オブジェクトを個別に呼び出すことも、両方を同時に呼び出すこともできます。
変換に関する注意事項
当初は、両方の MFCATL オブジェクトが MFC で実装されていました。 どちらも CCmdTarget の派生オブジェクトでした。 ObjectTwo は、次の手順に従って ATL を使用して実装されました。
ATL ヘッダー ファイル (Atlbase.h と Atlcom.h) を Premfcat.h にインクルードします。
Atlimpl.cpp を Premfcat.cpp にインクルードします。
追加 CAtlModule https://msdn.microsoft.com/ja-jp/library/hhz4ew64(v=vs.100)-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 の MFC 呼び出しの一致に COleObjectFactory::UpdateRegistryAll から呼び出します。
一致するように、_Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE)REGCLS_MULTIPLEUSE マクロによっては暗黙的に行う MFC のクラス ファクトリ、 IMPLEMENT_OLECREATE を呼び出します。
ObjectTwo ATL では以下の手順を再実装します。
ODL ファイル dispinterface からデュアル インターフェイスに変更します。
ODL コンパイルで、ATL に必要なヘッダー ファイル (Interf.h) を生成します。
.h ファイルと .cpp ファイルを書き直します。最も簡単な方法は、ATL ウィザードを実行して、自動的に生成されたコードを元の MFC コードにコピーして貼り付け、名前を変更する方法です。
OBJECT_ENTRY(CLSID_ObjectTwo, CObjectTwo) ATL オブジェクト マップに追加します。
このサンプルにはありませんが、場合によっては、次に示す変換手順も必要です。
IDL 形式への ODL ファイルの移植
-RegServer -UnregServer コマンドライン引数のサポートを追加します。
Keywords
このサンプルでは、次のキーワードを使用します。
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