靜態連結至 MFC 的標準 MFC DLL
以靜態方式連結至 MFC 的一般 MFC DLL 是內部使用 MFC 的 DLL,而且 MFC 或非 MFC 可執行檔可以呼叫 DLL 中的匯出函式。 如名稱所述,這種 DLL 是使用 MFC 的靜態程式庫版本所建置。 函式通常會使用標準 C 介面從一般 MFC DLL 匯出。 如需如何撰寫、建置及使用一般 MFC DLL 的範例,請參閱範例 DLLScreenCap 。
請注意,Visual C++ 檔中不再使用 USRDLL 一詞。 以靜態方式連結至 MFC 的一般 MFC DLL,其特性與前 USRDLL 相同。
以靜態方式連結至 MFC 的一般 MFC DLL 具有下列功能:
用戶端可執行檔可以用任何支援 DLL 使用的語言撰寫(C、C++、Pascal、Visual Basic 等):它不一定是 MFC 應用程式。
DLL 可以連結到應用程式所使用的相同 MFC 靜態程式庫。 DLL 不再有個別版本的靜態程式庫。
在 MFC 4.0 版之前,USRDL 會提供與以靜態方式連結至 MFC 的一般 MFC DLL 相同的功能類型。 自 Visual C++ 4.0 版起,USRDLL 一詞已經過時。
以靜態方式連結至 MFC 的一般 MFC DLL 具有下列需求:
這種類型的 DLL 必須具現化衍生自
CWinApp
的類別。這種類型的 DLL 會使用
DllMain
MFC 所提供的 。 將所有 DLL 特定的初始化程式碼放在成員函式中InitInstance
,並將終止程式碼ExitInstance
放在 一般 MFC 應用程式中。即使 USRDLL 一詞已經過時,您仍必須在編譯器命令列上定義 「 _USRDLL 」。 此定義會決定從 MFC 標頭檔提取哪些宣告。
一般 MFC DLL 必須具有 CWinApp
衍生類別和該應用程式類別的單一物件,MFC 應用程式也一樣。 不過, CWinApp
DLL 的物件沒有主要訊息幫浦,應用程式的物件也一樣 CWinApp
。
請注意,機制 CWinApp::Run
不適用於 DLL,因為應用程式擁有主要訊息幫浦。 如果 DLL 開啟無模式對話,或有自己的主框架視窗,則應用程式的主要訊息幫浦必須呼叫 DLL 匯出的常式,而 DLL 接著會呼叫 CWinApp::PreTranslateMessage
DLL 應用程式物件的成員函式。
如需此函式的範例,請參閱 DLLScreenCap 範例。
符號通常會使用標準 C 介面從一般 MFC DLL 匯出。 從一般 MFC DLL 匯出的函式宣告看起來會像這樣:
extern "C" __declspec(dllexport) MyExportedFunction( );
一般 MFC DLL 內的所有記憶體配置都應該保留在 DLL 內;DLL 不應該傳遞至呼叫可執行檔或接收下列任一項:
MFC 物件的指標
MFC 所配置的記憶體指標
如果您需要執行上述任何動作,或需要在呼叫可執行檔與 DLL 之間傳遞 MFC 衍生的物件,則必須建置 MFC 擴充 DLL。
只有在建立資料複本時,才能將指標傳遞至 C 執行時間程式庫在應用程式與 DLL 之間配置的記憶體。 您不得刪除或調整這些指標的大小,或不需要複製記憶體即可使用這些指標。
靜態連結至 MFC 的 DLL 也無法動態連結至共用 MFC DLL。 以靜態方式連結至 MFC 的 DLL 會動態系結至應用程式,就像任何其他 DLL 一樣;應用程式連結至它就像任何其他 DLL 一樣。
標準 MFC 靜態程式庫是根據 MFC DLL 命名慣例中所述 的慣例來命名。 不過,使用 MFC 3.0 版和更新版本,您不再需要手動指定連結器您要連結的 MFC 程式庫版本。 相反地,MFC 標頭檔會自動根據預處理器定義來決定要連結的正確 MFC 程式庫版本,例如 _DEBUG 或 _UNICODE 。 MFC 標頭檔會新增 /DEFAULTLIB 指示詞,指示連結器在特定版本的 MFC 程式庫中連結。