DLLHUSK サンプル : MFC ライブラリの動的なリンク
更新 : 2007 年 11 月
DLLHUSK サンプルでは、同じクラス ライブラリ コードを共有するアプリケーションおよびカスタム ダイナミック リンク ライブラリ (DLL: Dynamic Link Library) に MFC ライブラリを動的にリンクすることで、複数のアプリケーションの実行に必要なメモリの総容量を減らします。
また、MFC との動的なリンクによって、その他のアプリケーション アーキテクチャも可能になります。たとえば、アプリケーションの一部をカスタム DLL で実装し、アプリケーションとカスタム DLL の両方で MFC DLL (Mfcxx.dll) を共有できます。フレームワーク機能をアプリケーションと共有するカスタム DLL は、MFC 拡張 DLL と呼ばれます。
セキュリティに関するメモ : |
---|
このサンプル コードは概念を示す目的で提供されているものです。必ずしも最も安全なコーディング手法に従っているわけではないので、アプリケーションまたは Web サイトでは使用しないでください。Microsoft は、サンプル コードが意図しない目的で使用された場合に、付随的または間接的な損害について責任を負いません。 |
サンプルとそのインストール手順を取得するには
Visual Studio で、[ヘルプ] メニューの [サンプル] をクリックします。
詳細については、「サンプル ファイルの格納場所」を参照してください。
使用できるサンプルの最新バージョンと完全な一覧については、オンラインの Visual Studio 2008 Samples のページを参照してください。
サンプルは、コンピュータのハード ディスク上にもあります。既定では、サンプルおよび Readme ファイルは、\Program Files\Visual Studio 9.0\Samples\ の下のフォルダにコピーされます。Visual Studio Express Edition の場合、すべてのサンプルはオンライン上にあります。
サンプルのビルドと実行
DLLHUSK サンプルをビルドおよび実行するには
dllhusk.sln ソリューション ファイルを開きます。
[ビルド] メニューの [ビルド] をクリックします。
[デバッグ] メニューの [デバッグなしで開始] をクリックします。
DLLHUSK ソリューションは、Dllhusk.exe アプリケーション、およびアプリケーションと動的にリンクする 2 つの DLL (TESTDLL1.DLL と TESTDLL2.DLL) をビルドします。DLLHUSK は実行時に MFCxx.DLL または MFCxxD.DLL が必要です。必要な DLL は既定で Windows システム ディレクトリにインストールされています。
DLLHUSK MFC 拡張 DLL
DLLHUSK では、クラス エクスポート機能付きの MFC 拡張 DLL の例を示します。DLL (Testdll1.dll と Testdll2.dll) の C++ クラスは、AFX_EXT_CLASS マクロを使用してエクスポートされます。最初の MFC 拡張 DLL (TESTDLL1) では、フレームワークによってのみカスタム DLL のすべての C++ クラス インターフェイスにアクセスでき、アプリケーションから直接にはアクセスできません。カスタム DLL は、extern "C" 関数だけをアプリケーションにエクスポートします。カスタム DLL は、フレームワーク クラスから派生したクラスの関数をエクスポートする必要はありません。フレームワークからカスタム DLL の派生クラスへのすべての呼び出しは、C++ 仮想関数機構を通じて解決されます。
2 番目の MFC 拡張 DLL (TESTDLL2) では、カスタム DLL の一部の C++ クラス インターフェイスがアプリケーションにエクスポートされ、アプリケーションから直接アクセスできます。
Testdll1.dll
Testdll1.dll は、TEXT ドキュメント タイプと HELLO ドキュメント タイプの両方に対して、DLLHUSK のドキュメント クラスとビュー クラスを実装します。Dllhusk.exe は MDI フレーム ウィンドウ クラスを実装し、フレームワークはマルチ ドキュメント インターフェイス (MDI: Multiple Document Interface) 子ウィンドウ クラス (CMDIChildWnd) を実装します。2 つのドキュメント テンプレート オブジェクトは、CTextDoc、CMDIChildWnd、CEditView 間、および CDummyDoc、CMDIChildWnd、CHelloView 間の関連付けを確立します。このように、DLLHUSK では、フレームワークで定義されているオブジェクトのクラスをアプリケーション、カスタム (MFC 拡張) DLL、およびフレームワークの Mfcxx.dll で実装した場合でも、フレームワークによってこれらのオブジェクト間の関係を調整できることを示しています。
実際に、TESTDLL1 はアプリケーション オブジェクトの AddDocTemplate メンバ関数を 2 回呼び出して 2 つのドキュメント テンプレート オブジェクトを登録します。これは TESTDLL1 がエクスポートする唯一の関数である InitTestDLL1 の実装で行われます。この関数は extern "C" で宣言されているため、DLLHUSK アプリケーションではこの関数をスタンドアロンの C 関数として呼び出すことができます。
Dllhusk.cpp によって #include として追加されている Testdll1.h ヘッダー ファイルには、InitTestDLL1 の宣言だけでなく、TESTDLL1 のクラスも宣言されています。Dllhusk.cpp は、InitTestDLL1 関数だけを直接参照します。ただし、Testdll1.dll で実装されたドキュメント クラスとビュー クラスを間接的に使用します。
Testdll2.dll
Testdll2.dll は、DLLHUSK の CListOutputFrame クラスを実装します。ショートカット メニューで診断コマンドを選択すると、アプリケーションは CListOutputFrame オブジェクトを作成し、CListOutputFrame::AddString を呼び出して [List Output] ウィンドウに診断メッセージを送ります。
CListOutputFrame のすべてのパブリックなメンバ関数は、Testdll2.def ファイルでエクスポートされます。エクスポートには、AddString だけでなく、CListOutputFrame のパブリックなコンストラクタとデストラクタも含まれます。
クラス メンバ関数をエクスポートする MFC 拡張 DLL の実装は、C 関数だけをエクスポートする場合よりも困難です。これは特に、C++ の名前が装飾された関数のエクスポートを DLL の .def ファイルに手動で追加する必要があるためです。この方法については、「テクニカル ノート 33: MFC の DLL バージョン」を参照してください。
DLLHUSK のその他の機能
DLLHUSK では、次の内容についても示しています。
1 つのアプリケーションのリソースを複数の .rc ファイルに分割し、Visual C++ リソース エディタで編集できるようにする。
2 つのグローバル診断関数 AfxDoForAllClasses と AfxDoForAllObjects を使用する。
CDynLinkLibrary オブジェクトを列挙する。
キーワード
このサンプルでは、次のキーワードを使用します。
AfxDoForAllClasses; AfxDoForAllObjects; AfxGetApp; AfxGetResourceHandle; AfxMessageBox; AfxSetResourceHandle; AfxThrowMemoryException; CCmdUI::SetCheck; CColorDialog::DoModal; CColorDialog::GetColor; CDC::DrawText; CDC::SetBkColor; CDC::SetTextColor; CDialogBar::Create; CDocTemplate::GetDocString; CEditView::SerializeRaw; CFrameWnd::LoadFrame; CListBox::AddString; CListBox::Create; CListBox::GetCount; CListBox::GetText; CListBox::GetTextLen; CListBox::ResetContent; CListBox::SetCurSel; CMDIChildWnd::Create; CMenu::GetSubMenu; CMenu::LoadMenu; CMenu::TrackPopupMenu; CObject::AssertValid; CObject::Dump; CObject::Serialize; CStatusBar::Create; CStatusBar::SetIndicators; CToolBar::Create; CToolBar::LoadBitmap; CToolBar::SetButtons; CView::OnDraw; CWinApp::AddDocTemplate; CWinApp::InitInstance; CWinApp::LoadStdProfileSettings; CWinApp::OnFileNew; CWinApp::OpenDocumentFile; CWnd::GetClientRect; CWnd::GetCurrentMessage; CWnd::GetFont; CWnd::Invalidate; CWnd::OnCreate; CWnd::OnNcRButtonDown; CWnd::OpenClipboard; CWnd::SetFont; CWnd::ShowWindow; CWnd::UpdateWindow; CloseClipboard; EmptyClipboard; GetModuleFileName; GetSysColor; GlobalAlloc; GlobalLock; LOWORD; RGB; SetClipboardData; lstrlen; wsprintf
メモ : |
---|
このサンプルを含む一部のサンプルには、Visual C++ のウィザード、ライブラリ、およびコンパイラの変更が反映されていませんが、必要なタスクを実行する方法は示されています。 |