MFC提供了許多十分有用的類和對象,在很多時候在Office插件、BHO、常規(guī)DLL這樣的工程中加入MFC支持是一個不錯的選擇。但是,MFC中的很多功能,例如資源查找,消息預(yù)處理等等都依賴于在進(jìn)程或者線程創(chuàng)建時被初始化的MFC內(nèi)部數(shù)據(jù);而對于需要添加MFC支持的工程,這些數(shù)據(jù)并不會被自動地初始化。這時候使用一些MFC的功能,例如使用CString從字符串表加載一個字符串,或者使用CDialog::DoModal()創(chuàng)建一個模態(tài)對話框,都會有斷言錯誤,用ATL向?qū)?chuàng)建的支持MFC的程序也沒有多少改善,在CWinApp的DLL版本中沒有初始化線程數(shù)據(jù),所以調(diào)用AfxGetThread會返回空指針。解決這個問題的一個辦法是使用AfxBeginThread來啟動一個MFC線程,這樣MFC會初始化線程相關(guān)的數(shù)據(jù)。在下面的示例中,我在線程初始化時建立了一個模態(tài)對話框,以避免直接創(chuàng)建模態(tài)對話框會觸發(fā)的斷言失敗信息。為了模擬模態(tài)對話框的效果,在CDialogThread::WaitForDoModal()這個函數(shù)中創(chuàng)建了一個消息循環(huán)來等待線程結(jié)束,同時用MsgWaitForMultipleObjects來避免死鎖。因為MFC中和進(jìn)程相關(guān)的數(shù)據(jù)并不總是被正確初始化,在調(diào)用模態(tài)對話框之前也需要手動設(shè)置一下。
使用VC6.0編譯通過。
上面的方法只對于DLL之類的組件比較有用。對于使用MFC的應(yīng)用程序來說,上面的方法比較繁瑣。比較簡單的方法還是使用MFC向?qū)韯?chuàng)建應(yīng)用程序,然后再添加ATL或者.Net之類的額外支持。參考微軟知識庫文章Q181505和Q824480。
參考

文章來源:
http://blog.csdn.net/jiangsheng/archive/2005/08/20/459594.aspx