VC6到VS迁移所有问题的解决方法CJ60示例.docx
- 文档编号:4845467
- 上传时间:2022-12-10
- 格式:DOCX
- 页数:17
- 大小:561.26KB
VC6到VS迁移所有问题的解决方法CJ60示例.docx
《VC6到VS迁移所有问题的解决方法CJ60示例.docx》由会员分享,可在线阅读,更多相关《VC6到VS迁移所有问题的解决方法CJ60示例.docx(17页珍藏版)》请在冰豆网上搜索。
VC6到VS迁移所有问题的解决方法CJ60示例
VS2010编译Gh0st3.6
(一)
2011-06-3016:
35
Vs编译Gh0st修改的工作量还是挺大的,毕竟从VC6.0移植到VS2010平台,已经是一个很大的跨越了,VS2010相对于VC6.0也改进了不止一点了。
Gh0st3.6使用了第三方界面库CJ60Lib,目前这个库只支持到VC6.0,而其后的版本已经商业化,所以使用VS2010编译Gh0st的时候,需要重新编译CJ60Lib。
VS2010的自带安装的WindowsSDK已经到了7.1版,也不需要像VC6.0那样需要下载WindowsSDK,并配置环境了。
VC6.0支持的最高版本的WindowsSDK是Windows2003的,而VS2010自带的7.1版已经到了WindowsServer2008了,其中发生的变化也是很大的。
下面具体来操作一次。
先列一下几个主要下文件路径。
用的是Gh0s3.6原版,硬盘锁代码已经注释。
E:
\Programming\VS2010\Gh0st3.6
E:
\Programming\VS2010\Gh0st3.6\gh0st.dsw
E:
\Programming\VS2010\Gh0st3.6\gh0st\CJ60Lib
E:
\Programming\VS2010\Gh0st3.6\gh0st\CJ60Lib\CJ60Lib\CJ60Lib.dsw
E:
\Programming\VS2010\Gh0st3.6\gh0st\CJ60Lib\Lib
一.编译CJ60Lib库
直接用VS2010打开CJ60Lib.dsw进行转换。
一共有7个,有4个是已经不存在的项目了,直接删掉。
在灰色的项目上点右键–Remove,或直接按Del键删除。
1.1编译CJ60StaticLib
直接在CJ60StaticLib项目上点右键— ProjectOnly—-BuildOnlyCJ60StaticLib或者是RebuildOnlyCJ60StaticLib。
以后说编译某个项目也是这样,不再重复说明了。
1.1.1
首先修改程序配置,让默认的字符都为ANSI字符,VS2010默认为宽字符Unicode版。
项目—右键—属性—C/C++—Language—WChar_t—No,如图所示:
修改编译后,对照错误,再来一个一个的修改。
1.1.2
1> stdafx.cpp
1> _WIN32_WINNTnotdefined.Defaultingto_WIN32_WINNT_MAXVER(seeWinSDKVer.h)
1>e:
\programming\vs2010\gh0st3.6\gh0st\cj60lib\cj60lib\stdafx.h(51):
fatalerrorC1083:
无法打开包括文件:
“..\src\afximpl.h”:
Nosuchfileordirectory
双击这个错误,定位到stdafx.h中的
#include <..\src\afximpl.h>
把这句话改成
#include <..\src\mfc\afximpl.h>
1.1.3
接着修改warningC4819警告
warningC4819:
该文件包含不能在当前代码页(936)中表示的字符。
请将该文件保存为Unicode格式以防止数据丢失
这个警告至需要双击打开该文件,然后保存就可以了。
1.1.4
gh0st3.6\gh0st\cj60lib\cj60lib\subclass.cpp(117):
errorC2065:
“p”:
未声明的标识符
这是因为VS更符号C++标准,临时变量的作用域已经修正了,在Gh0st里,可以看到很多这样的代码。
只要把在for或if里面定义的变量,放到for或if之前定义就好了。
这里的代码是:
for(CSubclassWnd*p=theHookMap.Lookup(m_hWnd);p;p=p->m_pNext)
修改为
CSubclassWnd*p=NULL;
for(p=theHookMap.Lookup(m_hWnd);p;p=p->m_pNext)
后面的i也是一样修改。
gh0st3.6\gh0st\cj60lib\cj60lib\coolmenu.cpp(803):
errorC2065:
“i”:
未声明的标识符
for(i=0;i 这里的i,是在前面的 for(UINT i=0;i 里面定义的,只要把for里面的i放到for之前定义就可以了,修改如下: UINT i=0; for(i=0;i 这样的错误修改,以后不再写出,因为实在是太多了,修改方法也很简单。 1.1.5 gh0st3.6\gh0st\cj60lib\cj60lib\coolmenu.cpp(76): errorC4430: 缺少类型说明符–假定为int。 注意: C++不支持默认int 在VC6.0里,用修饰符申明的变量可以不现式的写出变量类型,默认类型为int。 如这里的constCXGAP=1;等于constintCXGAP=1;但是VS2010必须现式的指出,不能省略。 所以修改方法就是现式的写上定义类型。 //constantsusedfordrawing const CXGAP=1;//numpixelsbetweenbuttonandtext const CXTEXTMARGIN=2;//numpixelsafterhilitetostarttext const CXBUTTONMARGIN=2;//numpixelswiderbuttonisthanbitmap const CYBUTTONMARGIN=2;//dittoforheight 修改如下: //constantsusedfordrawing const int CXGAP=1;//numpixelsbetweenbuttonandtext const int CXTEXTMARGIN=2;//numpixelsafterhilitetostarttext const int CXBUTTONMARGIN=2;//numpixelswiderbuttonisthanbitmap const int CYBUTTONMARGIN=2;//dittoforheight 这个在Gh0st里有,以后这个错误也不在指出。 1.1.6 接下来要解决的就是一大堆的重定义错误了 1>c: \programfiles\microsoftsdks\windows\v7.0a\include\shlwapi.h(126): errorC2011: “tagSFBS_FLAGS”: “enum”类型重定义 1> c: \programfiles\microsoftsdks\windows\v7.0a\include\shlwapi.h(126): 参见“tagSFBS_FLAGS”的声明 1>c: \programfiles\microsoftsdks\windows\v7.0a\include\shlwapi.h(251): errorC2084: 函数“HRESULTSHLocalStrDupW(LPCWSTR,LPWSTR*)”已有主体 1> c: \programfiles\microsoftsdks\windows\v7.0a\include\shlwapi.h(250): 参见“SHLocalStrDupW”的前一个定义 1>c: \programfiles\microsoftsdks\windows\v7.0a\include\shlwapi.h(256): errorC2084: 函数“HRESULTSHLocalStrDupA(LPCSTR,LPSTR*)”已有主体 1> c: \programfiles\microsoftsdks\windows\v7.0a\include\shlwapi.h(255): 参见“SHLocalStrDupA”的前一个定义 1>c: \programfiles\microsoftsdks\windows\v7.0a\include\shlwapi.h(860): errorC2365: “URL_SCHEME_INVALID”: 重定义;以前的定义是“枚举数” 1> c: \programfiles\microsoftsdks\windows\v7.0a\include\shlwapi.h(860): 参见“URL_SCHEME_INVALID”的声明 1>c: \programfiles\microsoftsdks\windows\v7.0a\include\shlwapi.h(861): errorC2365: “URL_SCHEME_UNKNOWN”: 重定义;以前的定义是“枚举数” 1> c: \programfiles\microsoftsdks\windows\v7.0a\include\shlwapi.h(861): 参见“URL_SCHEME_UNKNOWN”的声明 1>c: \programfiles\microsoftsdks\windows\v7.0a\include\shlwapi.h(862): errorC2365: “URL_SCHEME_FTP”: 重定义;以前的定义是“枚举数” 1> c: \programfiles\microsoftsdks\windows\v7.0a\include\shlwapi.h(862): 参见“URL_SCHEME_FTP”的声明 1>c: \programfiles\microsoftsdks\windows\v7.0a\include\shlwapi.h(863): errorC2365: “URL_SCHEME_HTTP”: 重定义;以前的定义是“枚举数” 1> c: \programfiles\microsoftsdks\windows\v7.0a\include\shlwapi.h(863): 参见“URL_SCHEME_HTTP”的声明 1>c: \programfiles\microsoftsdks\windows\v7.0a\include\shlwapi.h(864): errorC2365: “URL_SCHEME_GOPHER”: 重定义;以前的定义是“枚举数” 1> c: \programfiles\microsoftsdks\windows\v7.0a\include\shlwapi.h(864): 参见“URL_SCHEME_GOPHER”的声明 1>c: \programfiles\microsoftsdks\windows\v7.0a\include\shlwapi.h(865): errorC2365: “URL_SCHEME_MAILTO”: 重定义;以前的定义是“枚举数” 1> c: \programfiles\microsoftsdks\windows\v7.0a\include\shlwapi.h(865): 参见“URL_SCHEME_MAILTO”的声明 1>c: \programfiles\microsoftsdks\windows\v7.0a\include\shlwapi.h(866): errorC2365: “URL_SCHEME_NEWS”: 重定义;以前的定义是“枚举数” 1> c: \programfiles\microsoftsdks\windows\v7.0a\include\shlwapi.h(866): 参见“URL_SCHEME_NEWS”的声明 造成这个原因是ATL和CJLIB库的兼容性问题上,从错误上看是shlwapi.h里的代码被重定义了,ATL在定义前都会判断一下是否已经定义,而CJLIB则没有判断。 解决方法是把CJLIB中的shlwapi.h包含给注释掉。 可以在当前项目搜索shlwapi.h,一共有两处。 E: \Programming\VS2010\Gh0st3.6\gh0st\CJ60Lib\Include\ModulVer.h E: \Programming\VS2010\Gh0st3.6\gh0st\CJ60Lib\Include\ShellTree.h 把其中的#include 重新编译后,错误一下少了很多,看起来也清爽了许多。 1.1.7 gh0st3.6\gh0st\cj60lib\cj60lib\cjsizedockbar.cpp(89): errorC2440: “static_cast”: 无法从“UINT(__thiscallCCJSizeDockBar: : *)(CPoint)”转换为“LRESULT(__thiscallCWnd: : *)(CPoint)” 1> 从基类型到派生类型的强制转换需要dynamic_cast或static_cast 这句话定位到的是ON_WM_NCHITTEST(),其实就是消息响应函数的返回值类型不匹配,这里也可以看出VS2010和VC6.0的不同。 ON_WM_NCHITTEST对应的消息函数是UINT CCJSizeDockBar: : OnNcHitTest(CPoint point),把返回值类型改下就好了。 有两处: E: \Programming\VS2010\Gh0st3.6\gh0st\CJ60Lib\CJ60Lib\CJSizeDockBar.cpp UINT CCJSizeDockBar: : OnNcHitTest(CPoint point) 修改为: LRESULT CCJSizeDockBar: : OnNcHitTest(CPoint point) E: \Programming\VS2010\Gh0st3.6\gh0st\CJ60Lib\Include\CJSizeDockBar.h afx_msg UINT OnNcHitTest(CPoint point); 修改为: afx_msg LRESULT OnNcHitTest(CPoint point); 后面还有一个一样的错误,只是所在类不一样,修改方法还是一样的 gh0st3.6\gh0st\cj60lib\cj60lib\cjcontrolbar.cpp(155): errorC2440: “static_cast”: 无法从“UINT(__thiscallCCJControlBar: : *)(CPoint)”转换为“LRESULT(__thiscallCWnd: : *)(CPoint)” 1> 从基类型到派生类型的强制转换需要dynamic_cast或static_cast 1.1.8 gh0st3.6\gh0st\cj60lib\cj60lib\cjpagerctrl.cpp(75): errorC2440: “static_cast”: 无法从“BOOL(__thiscallCCJPagerCtrl: : *)(NMPGSCROLL*,LRESULT*)”转换为“BOOL(__thiscallCCmdTarget: : *)(NMHDR*,LRESULT*)” 1> 在匹配目标类型的范围内没有具有该名称的函数 gh0st3.6\gh0st\cj60lib\cj60lib\cjpagerctrl.cpp(76): errorC2440: “static_cast”: 无法从“BOOL(__thiscallCCJPagerCtrl: : *)(NMPGCALCSIZE*,LRESULT*)”转换为“BOOL(__thiscallCCmdTarget: : *)(NMHDR*,LRESULT*)” 1> 在匹配目标类型的范围内没有具有该名称的函数 这两处的错误都是一样的,都是同一种参数类型不匹配。 定位信息: ON_NOTIFY_REFLECT_EX(PGN_SCROLL,OnPagerScroll) ON_NOTIFY_REFLECT_EX(PGN_CALCSIZE,OnPagerCalcSize) 可以看出他们所对应的函数分别是OnPagerScroll和OnPagerCalcSize。 直接在上面按F12(右键–跳转到定义处)就跳转到函数定义出了。 E: \Programming\VS2010\Gh0st3.6\gh0st\CJ60Lib\CJ60Lib\CJPagerCtrl.cpp BOOL CCJPagerCtrl: : OnPagerScroll(NMPGSCROLL*pNMPGScroll,LRESULT*pResult) { *pResult=0; return FALSE;//Letparenthandlemessage } 修改如下: BOOL CCJPagerCtrl: : OnPagerScroll(NMHDR*pNMPGScroll,LRESULT*pResult) { *pResult=0; return FALSE;//Letparenthandlemessage } =================================================== BOOL CCJPagerCtrl: : OnPagerCalcSize(NMPGCALCSIZE*pNMPGCalcSize,LRESULT*pResult) { switch(pNMPGCalcSize->dwFlag) 修改如下: BOOL CCJPagerCtrl: : OnPagerCalcSize(NMHDR*pNMHDRPGCalcSize,LRESULT*pResult) { NMPGCALCSIZE*pNMPGCalcSize=(NMPGCALCSIZE*)pNMHDRPGCalcSize; switch(pNMPGCalcSize->dwFlag) =================================================== 接着修改头文件中申明的参数类型 E: \Programming\VS2010\Gh0st3.6\gh0st\CJ60Lib\Include\CJPagerCtrl.h virtual BOOL OnPagerScroll(NMPGSCROLL*pNMPGScroll,LRESULT*pResult); virtual BOOL OnPagerCalcSize(NMPGCALCSIZE*pNMPGCalcSize,LRESULT*pResult); 修改如下: virtual BOOL OnPagerScroll(NMPGSCROLL*pNMPGScroll,LRESULT*pResult); virtual BOOL OnPagerCalcSize(NMHDR*pNMHDRPGCalcSize,LRESULT*pResult); 1.2编译CJ60Lib 首先还是修改字符集为ANSI,默然不为WChar_t。 这步是编译Gh0st每一个项目都需要做的,以后的操作中不再提起,请注意。 如果提示A函数和W函数重定义,参数冲突等,都是这个问题,改下项目属性就能解决了。 这个直接编译就能过了。 用VS2010编译函数很多安全函数的警告,这个不用管他,想修改也是可以的。 还有一个_WIN32_WINNT宏未定义的警告,如非必要,我就不加上去了,尽量的保持和原版的相同。 要加的话,直接加在每个项目的StdAfx.h里面。 格式: #define _WIN32_WINNT0×0500 这里的参数含义可以参看MSDN,后面有一处修改必须加,也会再次提到。 二.编译Gh0st 成功编译CJ60Lib界面库之后,就可以开始编译Gh0st了。 2.1转换Gh0st3.6项目 直接用VS2010打开Gh0st3.6\gh0st.dsw提示转换项目,确定转换就行了。 这里一共三个项目: gh0st,install,svchost。 编译的时候需要先编译svchost再编译install,最后才编译gh0st。 2.2编译svchost 相同的错误修改就不再说了,参看前面的修改方法。 修改已说过的错误,再继续下面的错误修改。 2.2.1 1>common\FileManager.cpp(202): errorC2440: “初始化”: 无法从“constchar*”转换为“char*” 1> 转换丢失限定符 char*lpExt=strrchr(lpFile,‘.’); 修改为: const char*lpExt=strrchr(lpFile,‘.’); 1>e: \programming\vs2010\gh0st3.6\server\svchost\common\loop.h(160): errorC2440: “=”: 无法从“constchar*”转换为“char*” 1> 转换丢失限定符 char*lpFileName=NULL; lpFileName=strrchr(lpURL,‘/’)+1; 修改为: const char*lpFileName=NULL; lpFileName=strrchr(lpURL,‘/’)+1; 2.2.2 1>common\ScreenSpy.cpp(355): errorC2062: 意外的类型“int” for(int i=0,intnToJump=0;i 修改为: for(int i=0,nToJump=0;i 2.2.3 1>common\VideoManager.cpp(123): errorC4430: 缺少类型说明符–假定为int。 注意: C++不支持默认int 定位在: staticdwLastScreen=GetTickCount(); 这个错误前面已经提到过,是
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC6 VS 迁移 所有 问题 解决方法 CJ60 示例