DLL 常見問題

MFC DLL 可以建立多個執行緒嗎?

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

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

  • InitInstanceCWinApp 一般 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)