共用方式為


動態連結至 MFC 的標準 MFC DLL

動態連結至 MFC 的一般 MFC DLL 是內部使用 MFC 的 DLL,而且 MFC 或非 MFC 可執行檔可以呼叫 DLL 中的導出函式。 如名稱所述,這種 DLL 是使用 MFC 的動態連結庫版本來建置的(也稱為 MFC 的共用版本)。 函式通常會使用標準 C 介面從一般 MFC DLL 匯出。

您必須在一般 MFC DLL 中所有導出的函式開頭新增 AFX_MANAGE_STATE 巨集,以動態連結至 MFC,將目前的模塊狀態設定為 DLL 的模組狀態。 這可藉由將下列程式代碼行新增至從 DLL 導出的函式開頭來完成:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

動態連結至 MFC 的一般 MFC DLL 具有下列功能:

  • 這是 Visual C++ 4.0 引進的新 DLL 類型。

  • 用戶端可執行檔可以用任何支援 DLL 使用的語言撰寫(C、C++、Pascal、Visual Basic 等等):它不一定是 MFC 應用程式。

  • 不同於靜態連結的一般 MFC DLL,這種類型的 DLL 會動態連結至 MFC DLL(也稱為共用 MFC DLL)。

  • 連結至此類型 DLL 的 MFC 匯入連結庫與使用 MFC DLL 的 MFC 擴充功能 DLL 或應用程式所使用的連結庫相同:MFCxx(D.lib)。

動態連結至 MFC 的一般 MFC DLL 具有下列需求:

  • 這些 DLL 是以已定義的_AFXDLL編譯,就像動態連結至 MFC DLL 的可執行檔一樣。 但 也會定義_USRDLL ,就像靜態連結至 MFC 的一般 MFC DLL 一樣。

  • 這種類型的 DLL 必須具現化 CWinApp衍生類別。

  • 這種類型的 DLL 會使用 DllMain MFC 所提供的 。 將所有 DLL 特定的初始化程式代碼放在成員函式中 InitInstance ,並將終止程式代碼 ExitInstance 放在 一般 MFC 應用程式中。

由於這種 DLL 使用 MFC 的動態連結庫版本,因此您必須將目前的模塊狀態明確設定為 DLL 的模組狀態。 若要這樣做,請在從 DLL 導出的每個函式開頭使用 AFX_MANAGE_STATE 巨集。

一般 MFC DLL 必須具有 CWinApp衍生類別和該應用程式類別的單一物件,MFC 應用程式也一樣。 不過, CWinApp DLL 的對象沒有主要訊息幫浦,應用程式的物件也一樣 CWinApp

請注意,機制 CWinApp::Run 不適用於 DLL,因為應用程式擁有主要訊息幫浦。 如果您的 DLL 啟動無模式對話,或有自己的主框架視窗,則應用程式的主要訊息幫浦必須呼叫呼叫 CWinApp::PreTranslateMessage的 DLL 導出例程。

將所有 DLL 特定的初始化放在成員函式中 CWinApp::InitInstance ,如同一般 MFC 應用程式一樣。 CWinApp::ExitInstance在卸除 DLL 之前,會CWinApp從 MFC 提供的DllMain函式呼叫衍生類別的成員函式。

您必須將共用 DLL MFCx0.dll和 Msvcr*0.dll (或類似檔案)散發給您的應用程式。

動態連結至 MFC 的 DLL 也無法以靜態方式連結至 MFC。 應用程式會連結至一般MFC DLL,動態連結至 MFC,就像任何其他 DLL 一樣。

符號通常會使用標準 C 介面從一般 MFC DLL 匯出。 從一般 MFC DLL 匯出之函式的宣告看起來像這樣:

extern "C" __declspec(dllexport) MyExportedFunction( );

一般 MFC DLL 內的所有記憶體配置都應該保留在 DLL 內;DLL 不應該傳遞至呼叫可執行檔或接收下列任一項:

  • MFC 物件的指標

  • MFC 所配置記憶體的指標

如果您需要執行上述任一項,或者如果您需要在呼叫的可執行檔與 DLL 之間傳遞 MFC 衍生的物件,則必須建置 MFC 延伸模組 DLL。

只有在建立數據複本時,才能將指標傳遞至 C 運行時間連結庫在應用程式與 DLL 之間配置的記憶體。 您不得刪除或調整這些指標的大小,或不需要複製記憶體即可使用這些指標。

建置動態連結至 MFC 的一般 MFC DLL 時,您必須使用巨集 AFX_MANAGE_STATE 正確切換 MFC 模組狀態。 這可藉由將下列程式代碼行新增至從 DLL 導出的函式開頭來完成:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

AFX_MANAGE_STATE巨集不應用於靜態連結至 MFC 的一般 MFC DLL 或 MFC 擴充 DLL 中。 如需詳細資訊,請參閱 管理 MFC 模組的狀態數據。

如需如何撰寫、建置及使用一般 MFC DLL 的範例,請參閱範例 DLLScreenCap。 如需動態連結至 MFC 之一般 MFC DLL 的詳細資訊,請參閱範例摘要中的<將 DLLScreenCap 轉換成使用 MFC DLL 動態連結>一節。

您想要做什麼事?

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

另請參閱

DLL 的種類