MFC DLL 可以建立多個線程嗎?
除了初始化期間,MFC DLL 可以安全地建立多個線程,只要它使用 Win32 線程本機記憶體 (TLS) 函式,例如 TlsAlloc 來配置線程本機記憶體。 不過,如果 MFC DLL 使用 __declspec(thread)
來配置線程本機記憶體,用戶端應用程式必須隱含連結至 DLL。 如果用戶端應用程式明確連結至 DLL,則對 LoadLibrary 的呼叫將不會成功載入 DLL。 如需 DLL 中線程局部變數的詳細資訊,請參閱 線程。
在啟動期間建立新 MFC 線程的 MFC DLL 會在應用程式載入時停止回應。 每當呼叫 AfxBeginThread
或 CWinThread::CreateThread
內部建立線程時,就會包含:
InitInstance
CWinApp
一般 MFC DLL 中衍生物件的 。在一般 MFC DLL 中提供的
DllMain
或 RawDllMain 函式。MFC 擴充 DLL 中提供的
DllMain
或 RawDllMain 函式。
多線程應用程式是否可以在不同的線程中存取 MFC DLL?
多線程應用程式可以存取一般 MFC DLL,以動態方式連結至不同線程的 MFC 和 MFC 擴充 DLL。 應用程式可以存取一般 MFC DLL,以靜態方式從應用程式中建立的多個線程連結至 MFC。
MFC DLL 中是否有任何 MFC 類別或函式無法使用?
擴充 DLL 使用 CWinApp
用戶端應用程式的衍生類別。 它們不得有自己的 CWinApp
衍生類別。
一般 MFC DLL 必須具有 CWinApp
衍生類別和該應用程式類別的單一物件,MFC 應用程式也一樣。 CWinApp
與應用程式的物件不同,CWinApp
DLL 的對象沒有主要訊息幫浦。
請注意, CWinApp::Run
由於機制不適用於 DLL,因此應用程式擁有主要訊息幫浦。 如果 DLL 開啟無模式對話框或有自己的主框架視窗,則應用程式的主要訊息幫浦必須呼叫 DLL 導出的例程,進而呼叫 CWinApp::PreTranslateMessage
DLL 應用程式對象的成員函式。
載入時,應該使用哪些優化技術來改善用戶端應用程式的效能?
如果您的 DLL 是靜態連結至 MFC 的一般 MFC DLL,請將它變更為動態連結至 MFC 的一般 MFC DLL 會減少檔案大小。
如果 DLL 有大量的匯出函式,請使用 .def 檔案來匯出函式(而不是使用 __declspec(dllexport)
),並在每個導出的函式上使用 .def 檔案 NONAME 屬性 。 NONAME 屬性只會造成序數值,而不會將函數名稱儲存在 DLL 的匯出數據表中,這樣會減少檔案大小。
當應用程式載入時,會載入隱含連結至應用程式的 DLL。 若要改善載入時的效能,請嘗試將 DLL 分割成不同的 DLL。 將呼叫應用程式在載入一個 DLL 之後立即需要的所有函式,並讓呼叫端應用程式隱含連結至該 DLL。 將呼叫應用程式不需要的其他函式立即放入另一個 DLL,並讓應用程式明確地連結到該 DLL。 如需詳細資訊,請參閱 將可執行文件連結至 DLL。
我的一般 MFC DLL 中有記憶體流失,但我的程式代碼看起來很好。 如何尋找記憶體流失?
記憶體流失的一個可能原因是 MFC 會建立在訊息處理程式函式內使用的暫存物件。 在 MFC 應用程式中,這些暫存物件會在處理訊息之間呼叫的 CWinApp::OnIdle()
函式中自動清除。 不過,在 MFC 動態連結庫 (DLL) 中,不會自動呼叫函 OnIdle()
式。 因此,暫存物件不會自動清除。 若要清除暫存物件,DLL 必須明確地定期呼叫 OnIdle(1)
。