分享方式:


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

您想要做什麼事?

您還想知道關於哪些方面的詳細資訊?

另請參閱

DLL 的種類