共用方式為


DLLScreenCap 範例:示範以靜態方式或動態方式連結至 MFC 的標準 DLL

更新:2007 年 11 月

DLLScreenCap 範例會說明畫面擷取工具的動態連結程式庫 (DLL) 版本。DLLScreenCap 取代了已經過時的 DLLTRACE 範例。在 MFC 1.0 版中,曾經介紹 DLLTRACE,說明如何撰寫本身已經以靜態方式連結至 MCF 程式庫的 DLL。DLLScreenCap 會對 Microsoft Windows 架構的應用程式 (本身已經以動態方式連結) 提供一個 C 架構的程式介面。以靜態方式連結至 MFC 程式庫的 DLL 無法成功地匯出從 MFC 類別衍生的任何類別的成員函式。

以靜態方式將 DLL 連結至 MFC 程式庫的技術,在技術提示 11:將 MFC 當成 DLL 的一部分來使用中有詳細的討論。DLLScreenCap 範例能夠以動態方式連結至 MFC,而不需做為擴充 DLL。在您決定要以靜態方式連結至 MFC 以實作自訂 DLL 之前,請考慮依照技術提示 33:MFC 的 DLL 版本中詳細說明和 DLLHUSK 範例所述來進行。

連結至 MFC 程式庫的非擴充 DLL 必須具有 CWinApp 衍生類別和此應用程式類別的單一物件,就像連結至可執行的 MFC 應用程式一樣。但是,DLL 的 CWinApp 物件並沒有像應用程式的 CWinApp 物件一樣的主要訊息幫浦 (Message Pump)。如果 DLL 開啟非強制回應的對話方塊,或是擁有自己的主框架視窗 (Main Frame Window),應用程式的主要訊息幫浦就必須呼叫由 DLL 匯出的常式,該常式會接著呼叫 DLL 應用程式物件的 CWinApp::PreTranslateMessage 成員函式。這是由 DLLScreenCap.dll 匯出的 FilterDllMsg 函式來說明。

ScreenCapApi.h 會顯示一個對用戶端應用程式提供 DLL 介面的方法,來宣告具有 extern "C" 的函式。使用 extern "C" 有許多好處。第一,它能夠讓非 C++ 用戶端應用程式也可以使用您的 DLL。第二,它降低了 DLL 虛耗的空間,因為 C++ 名稱裝飾 (Name Decoration) 無法套用至已匯出的名稱。第三,它讓您更容易明確地加入至 .def 檔案 (以便用於依序數匯出),而不需要擔心 C++ 名稱裝飾。

安全性注意事項:

這個程式碼範例僅供概念說明之用,同時因為範例中的程式碼撰寫並沒有周全的顧及所有安全性問題,所以本範例不適用於實際執行的應用程式或網站中。如果使用者擅自將範例程式碼用於其他意圖而導致連帶事件或重大損害時,Microsoft 將不承擔任何責任。

若要取得範例和指示以便進行安裝:

  • 按一下 Visual Studio [說明] 功能表上的 [範例]。

    如需詳細資訊,請參閱尋找範例檔案

  • 最新版的完整範例清單可從 Visual Studio 2008 範例網頁 (英文) 取得。

  • 您也可以將範例置於電腦硬碟中。根據預設,範例和讀我檔案都會複製到 \Program Files\Visual Studio 9.0\Samples\ 下的資料夾中。對於所有的 Visual Studio Express 版,所有範例都可在線上找到。

建置和執行範例

DLLScreenCap 範例由兩個專案所組成:DLL 專案 DLLScreenCap,和呼叫 DLL 的 EXE 專案 ScreenCap。

如果從提供的方案建置 ScreenCap,將會自動建置 DLLScreenCap 並將 DLL 複製到 ScreenCap 的輸出目錄中。

注意:因為這個範例是使用自訂建置步驟來複製檔案,因此您不可以使用 UNC 路徑開啟方案,請將範例檔案放置在具有磁碟機代號的目錄。

若要建置並 DLLScreenCap 範例

  1. 開啟 DllScreenCap.sln 方案。

  2. 在 [方案總管] 中,以滑鼠右鍵按一下 [ScreenCap] 專案資料夾,然後按一下快速鍵功能表中的 [設定為啟始專案]。

  3. 在 [建置] 功能表上,按一下 [建置]。

  4. 在 [偵錯] 功能表上,按一下 [啟動但不偵錯]。

在縮放視窗大小之後,ScreenCap 視窗會顯示最後擷取到的畫面。按一下 [File] 功能表上的 [Configure Screen Capture]。這個動作會開啟對話方塊,讓您指定是否要擷取畫面或是作用中的視窗,以及要用來儲存擷取到的檔案的路徑。按一下 [Screen Capture],建立一個擷取的檔案並更新用戶端視窗顯示。

使用 MFC DLL 將 DLLScreenCap 轉換為動態連結

DLLScreenCap 示範如何建立標準 DLL,此標準 DLL 具有可被呼叫以顯示強制回應對話方塊的匯出函式 (Exported Function)。在舊版的 Visual C++ 中,這是標準 DLL 中唯一可以使用的選項。這些 DLL 以前被認為是 _USRDLL。

現在,標準 DLL 可從共用的 MFCx0 DLL 使用 MFC。可能因為要降低組建 (Build) 檔案大小,您必須使用共用的 MFC.DLL 來建置 DLLScreenCap 範例。如果在 DLLScreenCap.dll 中支援共用的程式庫,將會減少發行建置 DLL 的檔案大小,從超過 100K 降到大約 16K,並將偵錯組建的大小由 1 MB 減少至 100K。若要支援 DLLScreenCap 中的動態連結,請使用 AFX_MANAGE_STATE 巨集來正確地切換全域 MFC 模組狀態。

若要驗證是否可以在共用程式庫中使用 DLLScreenCap

  1. 在 [方案總管] 中,以滑鼠右鍵按一下 ScreenCap 專案節點,然後在快速鍵功能表上按一下 [屬性]。

    [屬性頁] 對話方塊隨即出現。

  2. 從 [組態] 下拉式功能表中選取 [多重組態]。如需有關 [屬性頁] 對話方塊的詳細資訊,請參閱設定 Visual C++ 專案屬性

  3. 選取 [發行] 和 [偵錯] 組建來變更它們的設定。

  4. 在專案的一般屬性頁中,確認已經選取要在共用 DLL 屬性中使用 MFC 的 [MFC 的使用] 屬性。

  5. 確認以下幾行的程式碼都位於每個從 DLL 匯出的函式開頭 (請參閱管理 MFC 模組的狀態資料以取得更相關的討論):

    AFX_MANAGE_STATE(AfxGetStaticModuleState())
    

例如,DllScreenCap.dll 會匯出四個函式:

  • 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 範例