直接编译gh0st控制端源码会提示Cj60的一个库里面函数名找不到 估计是原来的库在VC60下编译 不匹配的问题
找到CJ60文件夹 打开 编译Cj60StaticLib库
1.报错 找不到文件<..\src\afximpl.h>
貌似从VC7开始这个头文件放在\src\mfc下 找到 stdafx.h 改之
#include <..\src\mfc\afximpl.h>
2.error C2440: “static_cast”: 无法从“UINT (__thiscall CCJControlBar::* )(CPoint)”转换为“LRESULT (__thiscall CWnd::* )(CPoint)”
类型定义的问题 把相关参数的函数返回值改成LRESULT
3.error C2440: “static_cast”: 无法从“BOOL (__thiscall CCJPagerCtrl::* )(NMPGSCROLL *,LRESULT *)”转换为“BOOL (__thiscall CCmdTarget::* )(NMHDR *,LRESULT *)”
宏展开后参数不匹配的问题 把NMPGSCROL改成NMHDR进子程序后强转
LPNMPGSCROL pnmpgs = (LPNMPGSCROL ) pnmhdr;
4.error C2664: “MultiByteToWideChar”: 不能将参数 5 从“USHORT *”转换为“LPWSTR”
这个是从某一版本以后 wchar_t开始变成编译器内置类型的问题 几个串类型之间不能默认转换 强转即可
接下来编译控制端gh0st
1.一上来提示找不到stdafx.h 我靠 打开header目录一看 有这个文件 ok 在附加包含目录里面加入“./” 解决了
2.error 2440 和刚才一样的问题 MFC展开宏的问题 进去强转指针即可
3.ok 到这里再编译 能通过了 刚才那一堆link错误 由于我们用vc8重新编译了cj60库也解决了 但是多出来几个link错误
nafxcw.lib(afxmem.obj) : error LNK2005: “void * __cdecl operator new(unsigned int)” (??2@YAPAXI@Z) 已经在 LIBCMT.lib(new.obj) 中定义
看意思大概是操作符在几个库里有重定义的问题 试了忽略nafxcw.lib和libcmt.lib 都不行 后翻到一篇帖子 这种问题需要在附加依赖项里面指定一下链接的先后顺序即可 先链接nafxcw.lib 后链接libcmt.lib 如果编译调试版在库后面加个d
好了 甩个服务端到虚拟机上去 咱们开始调试吧
参考文献:
http://topic.csdn.net/t/20030627/23/1966751.html
operator new 链接重定义的问题
http://blog.csdn.net/orbit/archive/2008/11/28/3405309.aspx
从VC6到VC9移植代码问题总结
从上海辞职回来已经大半年了,成都的感觉真好。
因缘际会做到了喜欢的游戏行业,想做的,做到了,这就是最大的幸福。
下班,骑着小车回家,路边都是臭豆腐摊子,老地方停下来吃了几个蛋烘糕,土豆丝的,豇豆的,芽菜的。
骑了一段,发现卖锅盔的婆婆今天尽然没收摊,冲上去要了两个,排在后面的哥们搞定了最后两个,话说平时这个小摊的顾客都是20个20个的买,那个汗啊。
回家,做做逆向,吃饭,洗澡上床,敲两行代码,直到深夜,要是不爽,还可以鼓捣老爸陪着出去喝啤酒吃烧烤。
周末,朋友,烫火锅,烫羊肉,陪老妈逛家具市场。
没有压抑,没有孤独,再没有看不到奔头的日子,今天下午的太阳真暖和。
VA的快捷键注释很好用,但默认的几种注释风格有一些单调,在开发中经常需要针对建立文件,修改,合并等不同动作进行不同注释。
笔者在编辑注释模板时遇到一些展开宏的名字不甚清楚,查阅了下列官方文档后解决问题。
文档中的宏定义:
Code
| Reserved String | Meaning | |
| Date | $DATE$ | Year/month/day formatted as %04d/%02d/%02d |
| $DAY$ | Day of month formatted as %d | |
| $DAY_02$ | Day of month formatted as %02d | |
| $DAYNAME$ | Three-character abbreviation of day | |
| $DAYLONGNAME$ | Full name of day | |
| $MONTH$ | Month formatted as %d | |
| $MONTH_02$ | Month formatted as %02d | |
| $MONTHNAME$ | Three-character abbreviation of month | |
| $MONTHLONGNAME$ | Full name of month | |
| $YEAR$ | Year formatted as %d | |
| $YEAR_02$ | Year formatted as %02d | |
| File | $FILE$ | Full filename with path* |
| $FILE_UPPER$ | Full filename with path in uppercase* | |
| $FILE_BASE$ | Filename without path or extension* | |
| $FILE_BASE_UPPER$ | Filename without path or extension in upper case* | |
| $FILE_EXT$ | Filename extension* | |
| $FILE_EXT_UPPER$ | Filename extension in upper case* | |
| $FILE_PATH$ | Path of file* | |
| $FILE_PATH_UPPER$ | Path of file in upper case* | |
| General | $clipboard$ | Current clipboard |
| $end$ | Position of caret after expansion | |
| $selected$ | Current selection** | |
| $$ | $ | |
| GUID | $GUID_DEFINITION$ | Generated GUID formatted for use in a definition |
| $GUID_STRING$ | Generated GUID formatted for use in a string | |
| $GUID_STRUCT$ | Generated GUID formatted for use in a struct | |
| (Note that all instances of GUID reserved words will use a singe generated GUID.) | ||
| Refactor | $GeneratedPropertyName$ | Property name generated during Encapsulate Field |
| $MethodArg$ | One parameter of the method and its type | |
| $MethodArgName$ | One parameter of the method | |
| $MethodArgType$ | Type of one parameter of the method | |
| $MethodBody$ | Body of implementation | |
| $MethodQualifier$ | Optional qualifiers of method | |
| $ParameterList$ | Parameters separated by commas | |
| $SymbolContext$ | Context and name of method | |
| $SymbolName$ | Name of method | |
| $SymbolPrivileges$ | Access of method | |
| $SymbolStatic$ | Keyword static or blank | |
| $SymbolType$ | Return type of method | |
| $SymbolVirtual$ | Keyword virtual or blank | |
| Time | $HOUR$ | Hour formatted as %d |
| $HOUR_02$ | Hour formatted as %02d | |
| $MINUTE$ | Minute formatted as %02d | |
| $SECOND$ | Second formatted as %02d | |
例子:
/****************************************************************
// FileName: $FILE_BASE$.$FILE_EXT$
// Author: freshbug
// Create: $MONTH$-$DAY$-$YEAR$
// Company: fresh-lab
// Checked: freshbug $MONTH$-$DAY$-$YEAR$
****************************************************************/
效果:
/****************************************************************
// FileName: BufferServerMsg.h
// Author: freshbug
// Create: 11-22-2008
// Company: fresh-lab
// Checked: freshbug 11-22-2008
****************************************************************/
原文连接请看这里:http://www.wholetomato.com/products/features/vasnippets.asp
公司需要一台缓冲服务器缓解数据库频繁存取的压力,请教几位大牛后,建议fb详细看看memcached源码,采用filemap开两个进程,一进一出。这样即使逻辑服务器当机,也可从buffer服务器中恢复数据,理想状态下在出现突发性事故时可以避免回档。
关于memcached的介绍请看官方主页说明:http://www.danga.com/memcached/
最新版本是1.2.6。下载页面是这个:http://www.danga.com/memcached/download.bml
也可点击这里(memcached-1.2.6.tar.gz)直接下载压缩包。
转一篇PeakGao大牛关于数据库缓冲服务器的文章:
http://www.cppblog.com/PeakGao/archive/2006/06/10/8379.html
PeakGao
别读成痞子高
游戏数据库的思考
上个周末看了下MySQL,安装了一个试了下,重点看了c测试程序已经mysql.h中的API,发现好简单,目前公司的游戏计划也是用mysql,但是要设计好一个给游戏使用的数据库模块,也不是简单的处理一下api就能了事的,游戏数据库由于存取特别频繁,在我看来,他的设计主要解决下面几个问题:1、数据缓存的功能
想想那么平凡的数据存取,完全依赖数据库的直接操作,这个性能是可想而知的,所以应该建立起游戏服务器和数据库之间的一个桥梁(暂且命名为数据库前端),游戏服务器只跟数据库前端交互,数据库前端自己具有数据持久化的策略,不依赖于游戏服务器的操作。数据库前端在第一次取出原始数据后(如一个角色登录时的数据),将进行本地缓存,下次存取数据都是在本地进行,并不需要更新到数据库中,至于何时更新到数据库可以有数据库前端自行决定(当然也不排除游戏服务器发出持久化的通知)。
2、增量更新的功能
其实好多数据的提交中,有很大一部分的数据是没有改变的,如果在从前端提交数据到数据库的时候采取相应的增量更新的办法,应该对性能会有所提升,尤其是在几个游戏服务器操作同一个数据库的时候,因为异步的原因,增量更新能够保证数据的正确性。
3、抛包策略
游戏服务器有很多数据实在太过频繁,但是有些类型的数据的重要性一般,所以中途丢失一些也问题不大,在服务器数据交换比较频繁的时候完全可以抛弃一些,加快存取速度(不过有了前端后是不是可以忽略这点)。
4、数据分流功能
主要体现在游戏服务器的一些不同类型的数据存取可以通过不同的几个异步队列进行处理,这样即使由于数据库的某些操作延时,也只影响到操作所在队列,不会影响其他队列。
5、灵活的多前端,多数据库等支持
实现游戏服务器,数据库前端,游戏数据库之间的多对多关系,便于灵活的运用。
写完后个人感觉达到第1,2点后,这个数据库前端功能就已经比较强劲了。
1. 不要辞职。不要换工作。不要转行。不要创业。
2. 多备份几个,自己可以去的公司职位。冬天里的裁员往往会一窝蜂。上次9.11之后,我周围的人走马灯式地换工作,不是自己想换,迫不得已啊。
3. 不要主动要求老板涨工资。裁员往往会从工资高的裁起。
4. 多帮朋友留意工作机会,多介绍,轮到自己找工作的时,才会有朋友帮你。
5. 存钱。买国债。或者双币存款。别买股票。
6. 每月给父母寄钱,经济不好,越穷的人越难过。
7. 别买车。
8. 危机的后期,才最难受。现在还没开始,别觉得自己很强、没事。
9. 别离婚。别生孩子。
10. 别找小三。


分享到做啥
分享到收客
