靜態連結至 MFC 的標準 DLL
更新:2007 年 11 月
靜態連結至 MFC 的標準 DLL 是內部使用 MFC 的 DLL,而且 DLL 裡的匯出函式可由 MFC 或非 MFC 可執行檔呼叫。如同名稱所說明,這類型的 DLL 是使用 MFC 的靜態連結程式庫版本來建置的。函式通常是從使用標準 C 介面的標準 DLL 來匯出。如需如何撰寫、建置和使用標準 DLL 的範例,請參閱 DLLScreenCap 範例。
請注意,Visual C++ 文件裡不再使用 USRDLL 詞彙。靜態連結至 MFC 的標準 DLL 與之前的 USRDLL 有相同的特性。
靜態連結至 MFC 的標準 DLL 有下列功能:
用戶端可執行檔可以使用任何支援 DLL 用法的語言來撰寫 (C、C++、Pascal、Visual Basic 等等);它不一定要是 MFC 應用程式。
DLL 可以連結至應用程式所用的相同 MFC 靜態連結程式庫。DLL 不再擁有不同版本的靜態連結程式庫。
MFC 4.0 版之前,USRDLL 提供與靜態連結至 MFC 之標準 DLL 相同類型的功能。在 Visual C++ 4.0 版已不再使用 USRDLL 這個詞彙。
靜態連結至 MFC 的標準 DLL 有下列需求:
這類型的 DLL 必須實體化自 CWinApp 衍生的類別。
這類的 DLL 會使用 MFC 所提供的 DllMain。將所有 DLL 特定的初始化程式碼置於 InitInstance 成員函式,並將終止程式碼置於 ExitInstance 裡,如同一般 MFC 應用程式裡一樣。
即使已不再使用 USRDLL 這個詞彙,您仍然必須在編譯器 (Compiler) 命令列上定義 "_USRDLL"。這種定義可決定要將何種宣告從 MFC 標頭檔 (Header File) 裡納入。
標準 DLL 必須像 MFC 應用程式一樣,擁有 CWinApp 衍生類別和此應用程式類別的單一物件。然而,DLL 的 CWinApp 物件並不像應用程式的 CWinApp 物件,其沒有主要的訊息幫浦。
請注意,應用程式有自己的主要訊息幫浦,所以 CWinApp::Run 機制並不適用於 DLL。如果 DLL 開啟了非強制回應 (Modeless) 的對話方塊或者有它自己的主框架視窗 (Main Frame Window),應用程式的主要訊息幫浦就必須呼叫由 DLL 匯出的常式,這個常式接著會呼叫 DLL 應用程式物件 (Application Object) 的 CWinApp::PreTranslateMessage 成員函式。
如需這個函式的範例,請參閱 DLLScreenCap 範例。
符號通常是由使用標準 C 介面的標準 DLL 匯出。由標準 DLL 匯出的函式宣告看起來像這樣:
extern "C" __declspec(dllexport) MyExportedFunction( );
標準 DLL 內的所有記憶體配置應該位於 DLL 中;DLL 應該不要從呼叫的可執行檔傳遞或接收下列任何一項:
MFC 物件的指標。
由 MFC 配置之記憶體的指標。
如果您需要做上述的任何一項,或者需要在呼叫的可執行檔和 DLL 之間傳遞 MFC 衍生物件,您就必須建置擴充 DLL。
只有當您將資料做複本時,將指標傳遞到由應用程式和 DLL 之間的 C 執行階段程式庫配置的記憶體才是安全的。您千萬不可在未製作記憶體複本情況下刪除或調整這些指標的大小,或者使用它們。
靜態連結至 MFC 的 DLL 也不能動態連結至共用的 MFC DLL。靜態連結至 MFC 的 DLL 會像其他任何 DLL 動態地繫結至應用程式;應用程式會像其他任何 DLL 地連結到該 DLL。
標準 MFC 靜態連結程式庫是根據 MFC DLL 命名慣例所述的慣例來命名。然而,使用 MFC 3.0 版和之後的版本,您就不再需要手動地為連結器指定您要連結的 MFC 程式庫版本。相反的,MFC 標頭檔會根據前置處理器定義,自動地決定要連結的正確 MFC 程式庫版本,例如 _DEBUG 或 _UNICODE。MFC 標頭檔會加入 /DEFAULTLIB 指示詞,指示連結器連結特定的 MFC 程式庫版本。