DLLScreenCap サンプル:説明する標準 DLL される静的または動的にリンクするには
DLLScreenCap サンプルでは、画面キャプチャ ツールのダイナミック リンク ライブラリ (DLL: Dynamic Link Library) バージョンについて説明します。 DLLScreenCap は、以前の DLLTRACE サンプルに取って代わるものです。 DLLTRACE は、MFC Version 1.0 で導入され、MFC ライブラリと静的にリンクされた DLL を作成する方法を示していました。 DLLScreenCap は、動的にリンクされる Microsoft Windows ベースのアプリケーションに対する C ベースのプログラム インターフェイスを備えています。 MFC ライブラリと静的にリンクされた DLL は、MFC クラスから派生した一切のクラスのメンバー関数を正常にエクスポートできません。
静的 DLL は MFC ライブラリへのリンクの手法については、説明 のテクニカル ノート 11。MFC DLL の一部として使用します。 DLLScreenCap サンプルを拡張 DLL にせずに MFC と動的にリンクすることもできます。 MFC に静的にリンクすることにより、カスタム DLL を実装する前で説明したように のテクニカル ノート 33 MFC 拡張 DLL として実装することを検討してください。DLL のバージョンの MFC と DLLHUSK 4fezhh3d(v=vs.100).md サンプルで示したとして。
MFC ライブラリにリンクされた非拡張 DLL には、実行可能な MFC アプリケーションの場合と同様に、CWinApp 派生クラスおよびそのアプリケーション クラスの単一オブジェクトが必要です。 アプリケーションの CWinApp オブジェクトはメイン メッセージ ポンプを備えていますが、DLL の CWinApp オブジェクトにはこの機能がありません。 DLL でモードレス ダイアログ ボックスを開く場合、または DLL 固有のメイン フレーム ウィンドウがある場合は、DLL がエクスポートしたルーチンをアプリケーションのメイン メッセージ ポンプで呼び出す必要があります。このルーチンが、DLL のアプリケーション オブジェクトの CWinApp::PreTranslateMessage メンバー関数を呼び出します。 詳細については、DLLScreenCap.dll がエクスポートする FilterDllMsg 関数を参照してください。
ScreenCapApi.h では、クライアント アプリケーションとの DLL インターフェイスを備えるために、extern "C" で関数を定義する方法を示しています。 extern "C" を使用すると、次のような利点があります。 第 1 に、DLL を C++ 以外のクライアント アプリケーションで使用できます。 第 2 に、エクスポートされた名前に C++ の名前の装飾が適用されないため、DLL のオーバーヘッドが減少します。 第 3 に、C++ の名前の装飾を意識せずに、序数によるエクスポートのための .def ファイルに明示的に追加することがより簡単になります。
セキュリティに関するメモ |
---|
このサンプル コードは概念を示すためのものであり、その概念に関連するコードのみを示しています。特定の環境について必ずしもセキュリティ要件を満たしていませんので、そのまま使用しないでください。セキュリティおよびエラー処理コードを追加して、プロジェクトをより安全かつ堅牢にすることをお勧めします。これらのサンプル コードは、現状有姿のままで提供されるものであり、一切保証されていません。 |
サンプルとそのインストール手順を取得するには
Visual Studio のサンプルにアクセスするには
[ヘルプ] メニューの [サンプル] をクリックします。
既定では、これらのサンプルは drive:\Program Files\Microsoft Visual Studio 10.0\Samples\ にインストールされています。
サンプルのビルドと実行
DLLScreenCap サンプルの 2 つのプロジェクトに含まれています。DLLScreenCap、DLL プロジェクト、および [ScreenCap]、[DLL を呼び出すの EXE プロジェクト。
提供されたソリューションから ScreenCap をビルドすると、自動的に DLLScreenCap がビルドされ、ScreenCap の出力ディレクトリに DLL がコピーされます。
Note このサンプルでは、カスタム ビルド ステップを使用してファイルをコピーするため、; UNC パスを使用してソリューションを開く必要がありません。サンプル ファイル、ディレクトリはドライブ文字を配置します。
DLLScreenCap サンプルをビルドおよび実行するには
DllScreenCap.sln ソリューション ファイルを開きます。
ソリューション エクスプローラーで、[ScreenCap] プロジェクト フォルダーをマウスの右ボタンでクリックし、として、ショートカット メニューの [スタートアップ プロジェクト セットをクリックします。
[ビルド] メニューの [ビルド] をクリックします。
でデバッグ メニューの、[デバッグなしで開始 をクリックします。
キャプチャした最後の画面が、ウィンドウのサイズに合わせて拡大/縮小され、ScreenCap のウィンドウに表示されます。 ファイル メニュー画面キャプチャの構成] をクリックします。 キャプチャしたファイルを保存するパスや、画面またはアクティブ ウィンドウのどちらをキャプチャするかを指定するためのダイアログ ボックスが表示されます。 キャプチャしたファイルを作成し、クライアント ウィンドウの表示を更新するのには画面キャプチャ をクリックします。
DLLScreenCap を変換して MFC DLL に動的にリンクする方法
DLLScreenCap は、モーダル ダイアログ ボックスを表示するために呼び出されるエクスポートされた関数を持つ、標準 DLL の作成方法を示します。 以前のバージョンの Visual C++ では、この方法が標準 DLL での唯一の選択肢でした。 このような DLL は、以前は _USRDLL と呼ばれていました。
現在では、標準 DLL は共有 MFCx0 DLL の MFC を使用できます。 ビルドのサイズを縮小できる可能性があるため、共有 MFC DLL を使用して DLLScreenCap サンプルをビルドすることもできます。 DLLScreenCap.dll で共有ライブラリを使用した場合は、DLL の 100 KB を超えるリリース ビルドのサイズは約 16 KB に削減され、1 MB を超えるデバッグ ビルドのサイズは 100 KB に削減されます。 DLLScreenCap で動的なリンクをサポートするには、AFX_MANAGE_STATE マクロを使用してグローバル MFC モジュール状態を正しく切り替えてください。
DLLScreenCap を共有ライブラリで使用できることを確認するには
ソリューション エクスプローラーで、[ScreenCap] プロジェクト ノードを右クリックし、ショートカット メニューの [プロパティ] をクリックします。
[プロパティ ページ] ダイアログ ボックスが表示されます。
[構成] ボックスの [複数の構成] をクリックします。 [プロパティ ページ] ダイアログ ボックスの詳細については、「Visual C++ プロジェクトのプロパティの設定」を参照してください。
Select both the Release and Debugbuilds to change their settings.
プロジェクトの全般プロパティ ページで、共有 DLL プロパティで MFC を使用するための MFC の使用プロパティが有効になっていることを確認します。
DLL からエクスポートされたすべての関数の先頭に、次のコード行があることを確認します。詳細については、「MFC モジュールの状態データの管理」を参照してください。
AFX_MANAGE_STATE(AfxGetStaticModuleState())
たとえば、DllScreenCap.dll は次の 4 つの関数をエクスポートします。
CaptureScreen
ConfigureCapture
ProcessDLLIdle
FilterDLLMsg
変換後の FilterDLLMsg は、次のようになります。
BOOL WINAPI FilterDllMsg(LPMSG lpMsg)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
TRY
{
return AfxGetApp()->PreTranslateMessage(lpMsg);
}
END_TRY
return FALSE;
}
Keywords
このサンプルでは、次のキーワードを使用します。
CDialog::DoModal, CWinApp::InitInstance, CWinApp::OnIdle, CWinApp::PreTranslateMessage, CWnd::DoDataExchange, CWnd::GetClientRect, CWnd::OnPaint, ShowWindow, UpdateWindow, CImage, AFX_MANAGE_STATE, AfxGetStaticModuleState, CWnd::GetDesktopWindow, CWnd::GetActiveWindow, CImage::Create, CImageDC, CImage::Save, SHBrowseForFolder, CImage::Load, CDC::SetStretchBltMode, CImage::StretchBlt, CWnd::OnEraseBkgnd, CWindowDC