DLLScreenCap サンプル : MFC と静的または動的にリンクする標準 DLL の例

更新 : 2007 年 11 月

DLLScreenCap サンプルでは、画面キャプチャ ツールのダイナミック リンク ライブラリ (DLL: Dynamic Link Library) バージョンについて説明します。DLLScreenCap は、以前の DLLTRACE サンプルに取って代わるものです。DLLTRACE は、MFC Version 1.0 で導入され、MFC ライブラリと静的にリンクされた DLL を作成する方法を示していました。DLLScreenCap は、動的にリンクされる Microsoft Windows ベースのアプリケーションに対する C ベースのプログラム インターフェイスを備えています。MFC ライブラリと静的にリンクされた DLL は、MFC クラスから派生した一切のクラスのメンバ関数を正常にエクスポートできません。

DLL を MFC ライブラリに静的にリンクする方法については、「テクニカル ノート 11: DLL の構成要素としての MFC」を参照してください。DLLScreenCap サンプルを拡張 DLL にせずに MFC と動的にリンクすることもできます。MFC と静的にリンクしてカスタム DLL を実装する前に、「テクニカル ノート 33: MFC の DLL バージョン」および DLLHUSK サンプルの説明を参照して、MFC 拡張 DLL として実装することも検討してください。

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 ファイルに明示的に追加することがより簡単になります。

7a51wcfx.alert_security(ja-jp,VS.90).gifセキュリティに関するメモ :

このサンプル コードは概念を示す目的で提供されているものです。必ずしも最も安全なコーディング手法に従っているわけではないため、アプリケーションまたは Web サイトでは使用しないでください。Microsoft は、サンプル コードが意図しない目的で使用された場合に、付随的または間接的な損害について責任を負いません。

サンプルとそのインストール手順を取得するには

  • Visual Studio で、[ヘルプ] メニューの [サンプル] をクリックします。

    詳細については、「サンプル ファイルの格納場所」を参照してください。

  • 使用できるサンプルの最新バージョンと完全な一覧については、オンラインの Visual Studio 2008 Samples のページを参照してください。

  • サンプルは、コンピュータのハード ディスク上にもあります。既定では、サンプルおよび Readme ファイルは、\Program Files\Visual Studio 9.0\Samples\ の下のフォルダにコピーされます。Visual Studio Express Edition の場合、すべてのサンプルはオンライン上にあります。

サンプルのビルドと実行

DLLScreenCap サンプルは、2 つのプロジェクトで構成されています。DLL プロジェクトの DLLScreenCap と、DLL を呼び出す EXE プロジェクトの ScreenCap です。

提供されたソリューションから ScreenCap をビルドすると、自動的に DLLScreenCap がビルドされ、ScreenCap の出力ディレクトリに DLL がコピーされます。

メモ   このサンプルではカスタム ビルド ステップを使用してファイルをコピーするため、UNC パスを使用してソリューションを開かないでください。ドライブ名の付いたディレクトリにサンプル ファイルを置いてください。

DLLScreenCap サンプルをビルドおよび実行するには

  1. DllScreenCap.sln ソリューション ファイルを開きます。

  2. ソリューション エクスプローラで、[ScreenCap] プロジェクト フォルダを右クリックし、ショートカット メニューの [スタートアップ プロジェクトとして設定] をクリックします。

  3. [ビルド] メニューの [ビルド] をクリックします。

  4. [デバッグ] メニューの [デバッグなしで開始] をクリックします。

キャプチャした最後の画面が、ウィンドウのサイズに合わせて拡大/縮小され、ScreenCap のウィンドウに表示されます。[File] メニューの [Configure Screen Capture] をクリックします。キャプチャしたファイルを保存するパスや、画面またはアクティブ ウィンドウのどちらをキャプチャするかを指定するためのダイアログ ボックスが表示されます。[Screen Capture] をクリックしてキャプチャしたファイルを作成し、クライアント ウィンドウの表示を更新します。

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 を共有ライブラリで使用できることを確認するには

  1. ソリューション エクスプローラで、[ScreenCap] プロジェクト ノードを右クリックし、ショートカット メニューの [プロパティ] をクリックします。

    [プロパティ ページ] ダイアログ ボックスが表示されます。

  2. [構成] ボックスの [複数の構成] をクリックします。[プロパティ ページ] ダイアログ ボックスの詳細については、「Visual C++ プロジェクトのプロパティの設定」を参照してください。

  3. [Release] と [Debug] の両方のビルドを選択し、設定を変更します。

  4. プロジェクトの全般プロパティ ページで、共有 DLL プロパティで MFC を使用するための MFC の使用プロパティが有効になっていることを確認します。

  5. 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;
}

キーワード

このサンプルでは、次のキーワードを使用します。

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

参照

その他の技術情報

MFC サンプル