VC6工程遷移到VC2008 SP1中,使用MFC 9.0靜態鏈接後運行錯誤的解決辦法

微軟前不久發佈了Visual Studio 2008 Service Pack 1,其中包含了據說是有BCGSoft提供的一些新類,可以直接使用Office 2007/Visual Studio 2005的界面,聞之大喜,終於不用再眼饞BCGControlBar和Xtreme Toolkit這些付費的庫了,爲了獲得VC6的界面,俺還在用自己4年前寫的庫:)

花了半天時間把手上的工程由VC6遷移到了VC2008,使用動態鏈接到MFC,一切正常(可惜在中文環境下字體很難看,這個貌似是一個BCG Library的bug,回頭等有空再來解決它)。考慮到客戶機上可能沒有MFC 9.0的DLL,於是改成了靜態鏈接,可惜編譯鏈接沒問題,運行時卻出錯了。

出錯的位置位於AfxTabCtrl.cpp第1395行,一個ENSURE宏斷言錯誤,看上去是找不到一個字符串資源。這種錯誤最爲頭疼,仔細檢查了compiler和linker的設置,使用的庫版本,沒有發現錯誤,只好使用土辦法“最小系統法”,用VC6生成一個MDI工程,轉換到VC2008,加入一個CDockablePane派生的窗口,使用靜態鏈接……果然同樣的錯誤,接着生成了一個空的VS2005 like的空項目,然後從代碼入手,一一對比檢查,還是沒有找到錯誤的地方,到底問題出在哪呢?忽然想到,或許應該從最原始的地方入手,既然是找不到IDS_AFXBARRES_CLOSEBAR定義的字符串,那麼就找找看它在哪定義的,在atlmfc目錄下搜索,這個ID定義在afxribbonres.h而存放於afxribbon.rc中。原來問題就在工程的rc文件中。VC2008生成的工程,在其rc文件中有如下代碼:

    #if !defined(_AFXDLL)
    #include "afxribbon.rc"  // MFC ribbon and control bar resources
    #endif
說明在靜態鏈接的時候,應該手動包含此資源。VC6生成的rc文件中自然是沒有這一動作的了,於是打開rc文件,加上這一段代碼,順利通過。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章