vc6版本支持的庫編譯:CJ60lib
1. 用vs2010打開CJ60庫的源碼的dsw,強制打開
(1)設置項目屬性的語言
因為,如果代碼字符的編碼集不一樣,則會出現函數沖定義,參數沖突等問題,這可以通過修改項目屬性可以修改。
因為VS2010默認示寬字符,所以,編譯要從VC6(默認窄字符),要修改項目屬性為不使用寬字符。
2. 編譯:項目,方式如下:
(1)“編譯”,出現一下問題:
![]()
定位文件,做一下修改
(2)再次build only
2.1
warning C4819: 該文件包含不能在當前代碼頁(936)中表示的字符。請將該文件保存為 Unicode 格式以防止數據丟失
雙擊提示,打開文件,然后保存即可
2.2
error C2065: “p”: 未聲明的標識符
error C2065: “i”: 未聲明的標識符
是因為vs2010更遵守C++標准,臨時變量已經修正,需要把for(),以及if()括號中的局部變量,調制for或者if之前定義即可。
2.3
error C4430: 缺少類型說明符 - 假定為 int。注意: C++ 不支持默認 int
添加 int 的類型
2.4
一大堆的重定義問題,如下:
error C2011: “tagSFBS_FLAGS”:“enum”類型重定義
這是因為, shlapi.h中的代碼被重新定義了,ATL在定義前會判斷一下是否已經定義,而CJLIB庫則沒有判定,所以,只需要針對CJlib庫源文件中的shlwapi.h包含注釋掉。,一共有兩處:
D:\TOOL3RDPART\CJ60源碼\著名界面庫cj60lib的源程序\Include\ModulVer.h(12):#include <shlwapi.h>
D:\TOOL3RDPART\CJ60源碼\著名界面庫cj60lib的源程序\Include\ShellTree.h(11):#include <Shlwapi.h>只需要再引用出,將該文件注釋掉
//#include <Shlwapi.h>
經過上述步驟的解決,則問題解決了一大部分:
2.5
1>d:\tool3rdpart\cj60源碼\著名界面庫cj60lib的源程序\cj60lib\cjcontrolbar.cpp(155): error C2440: “static_cast”: 無法從“UINT (__thiscall CCJControlBar::* )(CPoint)”轉換為“LRESULT (__thiscall CWnd::* )(CPoint)”從基類型到派生類型的強制轉換需要 dynamic_cast 或 static_cast
定位到ON_WM_NCHITTEST(),即消息響應 函數返回值類型不匹配,這是因為VS2010以及VC6構造是不一樣的。應該把
vc6的INT改為VS2010支持的LRESULT,因為打開問題消息響應,可以看到返回的類型是:
定位問題的相應函數:
在CJlib源碼中修改如下:
主要有兩個文件:
cj60lib\cjsizedockbar.cpp(89
cj60lib\cjcontrolbar.cpp(155)
2.6
cjpagerctrl.cpp(75): error C2440: “static_cast”: 無法從“BOOL (__thiscall CCJPagerCtrl::* )(NMPGSCROLL *,LRESULT *)”轉換為“BOOL (__thiscall CCmdTarget::* )(NMHDR *,LRESULT *)”
1> 在匹配目標類型的范圍內沒有具有該名稱的函數可以看出,VC6支持的是參數類型:NMPGSCROLL,而VS2010支持的參數是NMHDR,所以可以在CJlib修改源文件如下,統一參數不一致的問題。
修改為VS2010支持的類型:
即要修改實現,又要修改聲明。
解決以上問題,則可以輸出生成的dll文件
如果以debug編譯,則輸出d(debug)版本的庫
如果以release編譯,則輸出release版本。
注意,release,同樣要修改項目屬性語言為:不支持款字符。
end;