編輯

共用方式為


DLL 常見問題

MFC DLL 可以建立多個線程嗎?

除了初始化期間,MFC DLL 可以安全地建立多個線程,只要它使用 Win32 線程本機記憶體 (TLS) 函式,例如 TlsAlloc 來配置線程本機記憶體。 不過,如果 MFC DLL 使用 __declspec(thread) 來配置線程本機記憶體,用戶端應用程式必須隱含連結至 DLL。 如果用戶端應用程式明確連結至 DLL,則對 LoadLibrary呼叫將不會成功載入 DLL。 如需 DLL 中線程局部變數的詳細資訊,請參閱 線程

在啟動期間建立新 MFC 線程的 MFC DLL 會在應用程式載入時停止回應。 每當呼叫 AfxBeginThreadCWinThread::CreateThread 內部建立線程時,就會包含:

  • InitInstance CWinApp一般 MFC DLL 中衍生物件的 。

  • 在一般 MFC DLL 中提供的 DllMainRawDllMain 函式。

  • MFC 擴充 DLL 中提供的 DllMainRawDllMain 函式。

多線程應用程式是否可以在不同的線程中存取 MFC DLL?

多線程應用程式可以存取一般 MFC DLL,以動態方式連結至不同線程的 MFC 和 MFC 擴充 DLL。 應用程式可以存取一般 MFC DLL,以靜態方式從應用程式中建立的多個線程連結至 MFC。

MFC DLL 中是否有任何 MFC 類別或函式無法使用?

擴充 DLL 使用 CWinApp用戶端應用程式的衍生類別。 它們不得有自己的 CWinApp衍生類別。

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

請注意, 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)