这样的错误修改,以后不再写出,因为实在是太多了,修改方法也很简单。
1.1.5
gh0st3.6\gh0st\cj60lib\cj60lib\coolmenu.cpp(76):
errorC4430:
缺少类型说明符–假定为int。
注意:
C++不支持默认int
在VC6.0里,用修饰符申明的变量可以不现式的写出变量类型,默认类型为int。
如这里的constCXGAP=1;等于constintCXGAP=1;但是VS2010必须现式的指出,不能省略。
所以修改方法就是现式的写上定义类型。
//constantsusedfordrawing
constCXGAP=1;//numpixelsbetweenbuttonandtext
constCXTEXTMARGIN=2;//numpixelsafterhilitetostarttext
constCXBUTTONMARGIN=2;//numpixelswiderbuttonisthanbitmap
constCYBUTTONMARGIN=2;//dittoforheight
修改如下:
//constantsusedfordrawing
constintCXGAP=1;//numpixelsbetweenbuttonandtext
constintCXTEXTMARGIN=2;//numpixelsafterhilitetostarttext
constintCXBUTTONMARGIN=2;//numpixelswiderbuttonisthanbitmap
constintCYBUTTONMARGIN=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改成//#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对应的消息函数是UINTCCJSizeDockBar:
:
OnNcHitTest(CPointpoint),把返回值类型改下就好了。
有两处:
E:
\Programming\VS2010\Gh0st3.6\gh0st\CJ60Lib\CJ60Lib\CJSizeDockBar.cpp
UINTCCJSizeDockBar:
:
OnNcHitTest(CPointpoint)
修改为:
LRESULTCCJSizeDockBar:
:
OnNcHitTest(CPointpoint)
E:
\Programming\VS2010\Gh0st3.6\gh0st\CJ60Lib\Include\CJSizeDockBar.h
afx_msgUINTOnNcHitTest(CPointpoint);
修改为:
afx_msgLRESULTOnNcHitTest(CPointpoint);
后面还有一个一样的错误,只是所在类不一样,修改方法还是一样的
gh0st3.6\gh0st\cj60lib\cj60lib\cjcontrolbar.cpp(155):
errorC2440:
“static_cast”:
无法从“UINT(__thiscallCCJControlBar:
:
*)(CPoint)”转换为“LRESULT(__thiscallCWnd:
:
*)(CPoint)”
1>从基类型到派生类型的强制转换需要dynamic_cast或static_cast
这里就不再说了,请参考上面的修改。
VS2010编译Gh0st3.6
(一)续
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
BOOLCCJPagerCtrl:
:
OnPagerScroll(NMPGSCROLL*pNMPGScroll,LRESULT*pResult)
{
*pResult=0;
returnFALSE;//Letparenthandlemessage
}
修改如下:
BOOLCCJPagerCtrl:
:
OnPagerScroll(NMHDR*pNMPGScroll,LRESULT*pResult)
{
*pResult=0;
returnFALSE;//Letparenthandlemessage
}
===================================================
BOOLCCJPagerCtrl:
:
OnPagerCalcSize(NMPGCALCSIZE*pNMPGCalcSize,LRESULT*pResult)
{
switch(pNMPGCalcSize->dwFlag)
修改如下:
BOOLCCJPagerCtrl:
:
OnPagerCalcSize(NMHDR*pNMHDRPGCalcSize,LRESULT*pResult)
{
NMPGCALCSIZE*pNMPGCalcSize=(NMPGCALCSIZE*)pNMHDRPGCalcSize;
switch(pNMPGCalcSize->dwFlag)
===================================================
接着修改头文件中申明的参数类型
E:
\Programming\VS2010\Gh0st3.6\gh0st\CJ60Lib\Include\CJPagerCtrl.h
virtualBOOLOnPagerScroll(NMPGSCROLL*pNMPGScroll,LRESULT*pResult);
virtualBOOLOnPagerCalcSize(NMPGCALCSIZE*pNMPGCalcSize,LRESULT*pResult);
修改如下:
virtualBOOLOnPagerScroll(NMPGSCROLL*pNMPGScroll,LRESULT*pResult);
virtualBOOLOnPagerCalcSize(NMHDR*pNMHDRPGCalcSize,LRESULT*pResult);
1.2编译CJ60Lib
首先还是修改字符集为ANSI,默然不为WChar_t。
这步是编译Gh0st每一个项目都需要做的,以后的操作中不再提起,请注意。
如果提示A函数和W函数重定义,参数冲突等,都是这个问题,改下项目属性就能解决了。
这个直接编译就能过了。
用VS2010编译函数很多安全函数的警告,这个不用管他,想修改也是可以的。
还有一个_WIN32_WINNT宏未定义的警告,如非必要,我就不加上去了,尽量的保持和原版的相同。
要加的话,直接加在每个项目的StdAfx.h里面。
格式:
#define_WIN32_WINNT0×0500这里的参数含义可以参看MSDN,后面有一处修改必须加,也会再次提到。
VS2010编译Gh0st3.6
(二)
二.编译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,‘.’);
修改为:
constchar*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;
修改为:
constchar*lpFileName=NULL;
lpFileName=strrchr(lpURL,‘/’)+1;
2.2.2
1>common\ScreenSpy.cpp(355):
errorC2062:
意外的类型“int”
for(inti=0,intnToJump=0;i修改为:
for(inti=0,nToJump=0;i2.2.3
1>common\VideoManager.cpp(123):
errorC4430:
缺少类型说明符–假定为int。
注意:
C++不支持默认int
定位在:
staticdwLastScreen=GetTickCount();
这个错误前面已经提到过,是添加现式定义类型int。
这里添加现式类型为DWORD比较好,因为后面的函数GetTickCount返回值是DWORD类型。
在这里修改如下:
staticDWORDdwLastScreen=GetTickCount();
2.2.4
1>common\ScreenManager.cpp(7):
fatalerrorC1083:
无法打开包括文件:
“winable.h”:
Nosuch