靜態連結至 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 連結庫中連結。