動態連結至 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 動態連結>一節。