DLLHUSK サンプル:MFC ライブラリを動的にリンクします。
DLLHUSK サンプルでは、同じクラス ライブラリ コードを共有するアプリケーションおよびカスタム ダイナミック リンク ライブラリ (DLL: Dynamic Link Library) に MFC ライブラリを動的にリンクすることで、複数のアプリケーションの実行に必要なメモリの総容量を減らします。
また、MFC との動的なリンクによって、その他のアプリケーション アーキテクチャも可能になります。たとえば、アプリケーションの一部をカスタム DLL で実装し、アプリケーションとカスタム DLL の両方で MFC DLL (Mfcxx.dll) を共有できます。 フレームワーク機能をアプリケーションと共有するカスタム DLL は、MFC 拡張 DLL と呼ばれます。
![]() |
---|
このサンプル コードは概念を示すためのものであり、その概念に関連するコードのみを示しています。特定の環境について必ずしもセキュリティ要件を満たしていませんので、そのまま使用しないでください。セキュリティおよびエラー処理コードを追加して、プロジェクトをより安全かつ堅牢にすることをお勧めします。これらのサンプル コードは、現状有姿のままで提供されるものであり、一切保証されていません。 |
サンプルとそのインストール手順を取得するには
Visual Studio のサンプルにアクセスするには
[ヘルプ] メニューの [サンプル] をクリックします。
既定では、これらのサンプルは drive:\Program Files\Microsoft Visual Studio 10.0\Samples\ にインストールされています。
サンプルのビルドと実行
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 を呼び出す ことによって、一覧の出力ウィンドウに診断メッセージを送信します。
All public member functions ofCListOutputFrame are exported in the Testdll2.def file. エクスポートだけでなく AddString もパブリック CListOutputFrame コンストラクターおよびデストラクターが含まれます。
クラス メンバー関数をエクスポートする MFC 拡張 DLL の実装は、C 関数だけをエクスポートする場合よりも困難です。 これは特に、C++ の名前が装飾された関数のエクスポートを DLL の .def ファイルに手動で追加する必要があるためです。 この方法については、「テクニカル ノート 33: MFC の DLL バージョン」を参照してください。
DLLHUSK のその他の機能
DLLHUSK では、次の内容についても示しています。
1 つのアプリケーションのリソースを複数の .rc ファイルに分割し、Visual C++ リソース エディターで編集できるようにする。
2 つのグローバル診断関数 AfxDoForAllClasses と AfxDoForAllObjects を使用する。
CDynLinkLibrary オブジェクトを列挙しています。
Keywords
このサンプルでは、次のキーワードを使用します。
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++ のウィザード、ライブラリ、およびコンパイラの変更が反映されていませんが、必要なタスクを実行する方法は示されています。