[网狐]内核引擎KernelEngine移植

来源:互联网 发布:启航网络 编辑:程序博客网 时间:2024/06/03 21:50

没有KernelEngine内核源码?

最近跳槽了,现在这家公司用网狐服务器开发的项目,网狐老夫熟悉啊,以前研究过代码,所以工作上手很快,但是很快问题来了,KernelEngine这个Dll居然没.源.码,来让你们也感受一下.
这里写图片描述
最后逼的我都要看汇编了,奈何看不懂.
好啦以上是我的心路崩溃历程,最后决定移植其他有源码项目到本项目里,没想到成功了,这就是这篇文章的由来.

开搞

1.新建个文件夹,复制源码工程KernelEngine.vcproj文件到这个文件夹里
这里写图片描述

2.我们肯定要弄个新名字不和原来的工程名冲突,类名也要统一改.
我们把新复制过来的KernelEngine.vcproj改成KernelEngineEx.vcproj 以后所有用到的类后面都加上Ex和原工程区分开来.
3.用文本编辑器,打开KernelEngineEx.vcproj 全局替换,KernelEngine全部替换为KernelEngineEx.我用的是notepad++
这里写图片描述

4.VC打开工程把文件都清理干净,工程名改成新内核引擎
这里写图片描述

5.这里有个宏需要添加一下DECLARE_MODULE_HELPER_EX
……\系统模块\全局定义\Module.h
这里写图片描述

//组件辅助类宏#define DECLARE_MODULE_HELPER_EX(OBJECT_NAME,MODULE_DLL_NAME,CREATE_FUNCTION_NAME)                              \class C##OBJECT_NAME##ExHelper : public CTempldateHelper<I##OBJECT_NAME>                            \{                                                                                                           \public:                                                                                                     \    C##OBJECT_NAME##ExHelper() : CTempldateHelper<I##OBJECT_NAME>(IID_I##OBJECT_NAME,                           \    VER_I##OBJECT_NAME,MODULE_DLL_NAME,CREATE_FUNCTION_NAME) { }                                        \};

6.创建KernelEngineHeadEx.h头文件

#pragma once//导出定义#ifndef KERNEL_ENGINE_CLASSEx#ifdef  KERNEL_ENGINE_DLLEx#define KERNEL_ENGINE_CLASSEx _declspec(dllexport)#else#define KERNEL_ENGINE_CLASSEx _declspec(dllimport)#endif#endif//模块定义#ifndef _DEBUG#define KERNEL_ENGINE_DLL_NAMEEx  TEXT("KernelEngineEx.dll")      //组件 DLL 名字#else#define KERNEL_ENGINE_DLL_NAMEEx  TEXT("KernelEngineExD.dll")     //组件 DLL 名字#endifDECLARE_MODULE_HELPER_EX(DataBase,KERNEL_ENGINE_DLL_NAMEEx,"CreateDataBaseEx")DECLARE_MODULE_HELPER_EX(TimerEngine,KERNEL_ENGINE_DLL_NAMEEx,"CreateTimerEngineEx")DECLARE_MODULE_HELPER_EX(DataBaseEngine,KERNEL_ENGINE_DLL_NAMEEx,"CreateDataBaseEngineEx")DECLARE_MODULE_HELPER_EX(AttemperEngine,KERNEL_ENGINE_DLL_NAMEEx,"CreateAttemperEngineEx")DECLARE_MODULE_HELPER_EX(TCPSocketService,KERNEL_ENGINE_DLL_NAMEEx,"CreateTCPSocketServiceEx")DECLARE_MODULE_HELPER_EX(WEBSocketService,KERNEL_ENGINE_DLL_NAMEEx,"CreateWEBSocketServiceEx")DECLARE_MODULE_HELPER_EX(TCPNetworkEngine,KERNEL_ENGINE_DLL_NAMEEx,"CreateTCPNetworkEngineEx")DECLARE_MODULE_HELPER_EX(UDPNetworkEngine,KERNEL_ENGINE_DLL_NAMEEx,"CreateUDPNetworkEngineEx")DECLARE_MODULE_HELPER_EX(AsynchronismEngine,KERNEL_ENGINE_DLL_NAMEEx,"CreateAsynchronismEngineEx")DECLARE_MODULE_HELPER_EX(TraceServiceManager,KERNEL_ENGINE_DLL_NAMEEx,"CreateTraceServiceManagerEx")

7.在stdafx.h 引用原工程KernelEngineHead.h

#include "..\..\服务器组件\内核引擎\KernelEngineHead.h"

8.修改预处理器添加KERNEL_ENGINE_DLLEx 宏定义
这里写图片描述

9.拷贝文件并添加入工程并且改名
这里写图片描述

10.把所有类名都修改了,后面加上Ex
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述
11.新建两个def文件
这里写图片描述

KernelEngineEx.def

; KernelEngineEx.def : 声明 DLL 的模块参数。LIBRARY      "KernelEngineEx"EXPORTS    ; 此处可以是显式导出

KernelEngineExD.def

; KernelEngineExD.def : 声明 DLL 的模块参数。LIBRARY      "KernelEngineExD"EXPORTS    ; 此处可以是显式导出

好啦,编译成功了,因为是复制没有源码的工程文件KernelEngineEx.vcproj 设置,输出路径肯定是你工程里的,还有一点是,你现在没有源码的工程没被其他人加工过,如果我提供的带源码的工程和你的工程函数不一样那就没办法了.

工程弄好了,我们应用一下,看下效果
1.把新的工程添加到项目里
这里写图片描述

2.游戏服务器stdafx.h里添加新的工程导入lib
这里写图片描述

#include "..\..\服务器组件\新内核引擎\KernelEngineHeadEx.h"//链接代码#ifndef _DEBUG#ifndef _UNICODE    #pragma comment (lib,"../../链接库/Ansi/KernelEngineEx.lib")#else    #pragma comment (lib,"../../链接库/Unicode/KernelEngineEx.lib")#endif#else#ifndef _UNICODE    #pragma comment (lib,"../../链接库/Ansi/KernelEngineExD.lib")#else    #pragma comment (lib,"../../链接库/Unicode/KernelEngineExD.lib")#endif

3.找到ServieUnits.h 把原来的类声明改成我们加入的新的类

CTimerEngineExHelper                m_TimerEngine;                      CAttemperEngineExHelper         m_AttemperEngine;   

这里写图片描述

4.好了大功告成.F5跑一下看看.
这里写图片描述

写在最后

网狐在网上流出的版本太多了,如果我提供的源码工程和你现在用的工程不匹配,那你就只能多找几个版本了.

可能有的朋友要问了,为啥不用带源码的项目开发啊,非要费劲的移植啊,我只能呵呵,公司这个项目开发好久了,不是说换其他版本框架就换的,毕竟现在的版本很稳定,已经趟过好多坑了.

好啦,这里提供我找的源码工程和移植的工程.所以这些移植只是可以让你调试你的程序,找到崩溃的地方,项目还是要用公司原来的不带源码的工程跑.

希望这篇文章能帮助到你

源码下载地址