KernelModule/AttemperEngine.cpp
//队列接口
OnQueueServiceSink(BYTE cbThreadIndex,WORD wIdentifier,void * pBuffer, WORD wDataSize,DWORD dwInsertTime)
中的网络读取事件
有这些句
_BEGIN_TRY
{
bSuccess = m_pIAttemperEngineSink->OnEventSocketRead(cbThreadIndex,pSocketReadEvent->Command,pSocketReadEvent+1,pSocketReadEvent->wDataSize,pSocketReadEvent);
}
CATCH_COMON_EXCEPTION(;)
CATCH_UNKNOW_EXCEPTION(;)
_END_CATCH
IAttemperEngineSink * m_pIAttemperEngineSink; //挂接接口
而这个挂接的接口被CenterServer,GameFrameModule,PlazaServer三个类都有继承,那么如何知道调用的函数OnEventSocketRead是响应GameFrameModule中的
CAttemperEngineSink::OnEventSocketRead??
--------------------------------------------------------------------
GameFrameModule/AttemperEngine.cpp
//网络事件
OnEventSocketRead(BYTE cbThreadIndex,CMD_Command Command,void * pDataBuffer,WORD wDataSize,NTY_SocketReadEvent * pSocketReadEvent)
中的游戏消息
OnSocketMainGame(Command,pDataBuffer,wDataSize,pSocketReadEvent);
----------------------------------------------------------------------
GameFrameModule/AttemperEngine.cpp
//游戏消息处理
OnSocketMainGame(CMD_Command,void * pDataBuffer,WORD wDataSize,NTY_SocketReadEvent * pSocketReadEvent)
中的消息处理
//获取用户
IServerUserItem * pIServerUserItem=GetServerUserItem(pSocketReadEvent->wIndex);
if (pIServerUserItem==NULL) return false;
//处理过虑
tagServerUserData * pUserData=pIServerUserItem->GetUserData();
if ((pUserData->UserStatus.wTableID==INVALID_TABLE)||(pUserData->UserStatus.wChairID==INVALID_CHAIR)) return true;
//消息处理
CTableFrame * pTableFrame=(m_pTableFrame+pUserData->UserStatus.wTableID);
return pTableFrame->OnEventSocketGame(Command.wSubCmdID,pDataBuffer,wDataSize,pIServerUserItem);
------------------------------------------------------------------
GameFrameModule/TableFrame.cpp
//游戏事件处理
bool __cdecl CTableFrame::OnEventSocketGame(WORD wSubCmdID, const void * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem)
{
//效验参数
GT_ASSERT(pIServerUserItem!=NULL);
GT_ASSERT(m_pITableFrameSink!=NULL);
//消息处理
return m_pITableFrameSink->OnGameMessage(wSubCmdID,pDataBuffer,wDataSize,pIServerUserItem);
}
ITableFrameSink * m_pITableFrameSink; //桌子接口
-----------------------------------------------------------------------------------------------
到这里为止,现在具体的实现也就在于具体的游戏模块中的了
//游戏桌子类
class CTableFrameSink : public ITableFrameSink, public ITableFrameEvent
此游戏模块中的类已经继承了,ITableFrameSink
所以加执行如下重载函数
bool __cdecl CTableFrameSink::OnGameMessage(WORD wSubCmdID, const void * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem)
{
switch (wSubCmdID)
{
case SUB_C_ADD_GOLD: //用户加注
{
//效验数据
tagServerUserData * pUserData=pIServerUserItem->GetUserData();
//消息处理
CMD_C_AddGold * pAddGold=(CMD_C_AddGold *)pDataBuffer;
//游戏加注处理
OnUserAddGold(pUserData->UserStatus.wChairID,pAddGold,false);
return true;
}
case SUB_C_YiCi:
{
tagServerUserData * pUserData=pIServerUserItem->GetUserData();
if (pUserData->UserStatus.cbUserStatus!=US_PLAY) return true;
if (m_bPlayStatus[pUserData->UserStatus.wChairID]==FALSE) return true;
//
BYTE cbQuChair = pUserData->UserStatus.wChairID;
m_cGameLogic.m_bAddGold[cbQuChair][m_cbQuIndex[cbQuChair][m_cbQuCount[cbQuChair]-1]]
-= m_wQuValue[cbQuChair][ m_cbQuCount[cbQuChair]-1 ];//索引
m_fAddGoldSum[cbQuChair] -= m_wQuValue[cbQuChair][ m_cbQuCount[cbQuChair]-1 ];//投注总和
m_iAllAddGoldsum -= m_wQuValue[cbQuChair][ m_cbQuCount[cbQuChair]-1 ];//桌面总注数
CMD_S_AddGold OwnAddGold;
ZeroMemory(&OwnAddGold,sizeof(OwnAddGold));
OwnAddGold.iIndex = m_cbQuIndex[cbQuChair][m_cbQuCount[cbQuChair]-1];
OwnAddGold.iValue = m_wQuValue[cbQuChair][ m_cbQuCount[cbQuChair]-1 ];
OwnAddGold.iValueSum = m_iAllAddGoldsum;
m_pITableFrame->SendTableData(cbQuChair,SUB_S_QuYiCi,&OwnAddGold,sizeof(OwnAddGold));
--m_cbQuCount[cbQuChair];
return true;
}
case SUB_C_QuanBu:
{
tagServerUserData * pUserData=pIServerUserItem->GetUserData();
if (pUserData->UserStatus.cbUserStatus!=US_PLAY) return true;
if (m_bPlayStatus[pUserData->UserStatus.wChairID]==FALSE) return true;
//
BYTE cbQuChair = pUserData->UserStatus.wChairID;
memset( m_cGameLogic.m_bAddGold[cbQuChair],0,sizeof(m_cGameLogic.m_bAddGold[cbQuChair]) );//索引
m_iAllAddGoldsum -= m_fAddGoldSum[cbQuChair];//桌面总注数
m_fAddGoldSum[cbQuChair] = 0;//投注总和
memset( m_cbQuIndex[cbQuChair],0,sizeof(m_cbQuIndex[cbQuChair]) );
memset( m_wQuValue[cbQuChair],0,sizeof(m_wQuValue[cbQuChair]) );
m_cbQuCount[cbQuChair] = 0;
m_pITableFrame->SendTableData(cbQuChair,SUB_S_QuQuanBu,0,0);
return true;
}
//视频配置
case SUB_S_VEDIOSTREAM:
{
tagServerUserData * pUserData=pIServerUserItem->GetUserData();
//
BYTE cbQuChair = pUserData->UserStatus.wChairID;
CMD_S_VedioStream vedioStream;
WORD wSize = sizeof(vedioStream);
ZeroMemory(&vedioStream,wSize);
_tcscpy(vedioStream.szMainStream,m_pGameServiceOption->szMainVideoID);
_tcscpy(vedioStream.szSubStream,m_pGameServiceOption->szSubVideoID);
m_pITableFrame->SendTableData(cbQuChair,SUB_S_VEDIOSTREAM,&vedioStream,wSize);
}
default:
return true;
}
return false;
}
-----------------------------------------------------------
解决方案以下
--------------------------------------------------------------
现在跟踪下OnQueueServiceSink,在此之前一定会有将m_pIAttemperEngineSink进行赋值的,而且一定在AtteperEngine.cpp里
KernelModule/QueueService.cpp
//数据消息
void CQueueService::OnQueueServiceThread(BYTE cbThreadIndex, const tagDataHead & DataHead, void * pBuffer, WORD wDataSize)
{
GT_ASSERT(m_pIQueueServiceSink!=NULL);
_BEGIN_TRY
{
m_pIQueueServiceSink->OnQueueServiceSink(cbThreadIndex,DataHead.wIdentifier,pBuffer,DataHead.wDataSize,DataHead.dwInsertTime);
}
CATCH_COMMON_EXCEPTION(;)
CATCH_UNKNOWN_EXCEPTION(;)_END_CATCH
return;
}
IQueueServiceSink * m_pIQueueServiceSink; //回调接口
怎么跑到QueueService.cpp中去了呢
先不管,看看OnQueueServiceThread函数是在哪执行的吧
//Run函数
bool CQueueServiceThread::RepetitionRun()
{
//效验参数
GT_ASSERT(m_hCompletionPort!=NULL);
//变量定义
DWORD dwThancferred=0;
OVERLAPPED * pOverLapped=NULL;
CQueueService * pQueueService=NULL;
//等待完成端口
if (GetQueuedCompletionStatus(m_hCompletionPort,&dwThancferred,(PULONG_PTR)&pQueueService,&pOverLapped,INFINITE))
{
//判断退出
if (pQueueService==NULL) return false;
//获取数据
tagDataHead DataHead;
bool bSuccess=pQueueService->GetData(DataHead,m_cbBuffer,sizeof(m_cbBuffer));
GT_ASSERT(bSuccess==true);
//处理数据
if (bSuccess==true) pQueueService->OnQueueServiceThread(m_cbThreadIndex, DataHead,m_cbBuffer,DataHead.wDataSize);
return true;
}
return false;
}
看来这个方向是错了,那么,m_pIAttemperEngineSink的赋值应该就在AttemperEngine.cpp里的某个初始值里的,或是先于OnQueueServiceSink执行
而在这里,只有发现一个注册钩子的函数有对m_pIAttemperEngineSink进行赋值操作
//注册钩子
bool __cdecl CAttemperEngine::SetAttemperEngineSink(IUnknownEx * pIUnknownEx)
{
//效验参数
ASSERT(pIUnknownEx!=NULL);
ASSERT(m_pIAttemperEngineSink==NULL);
if (pIUnknownEx==NULL) return false;
if (m_pIAttemperEngineSink!=NULL) return false;
//查询接口
m_pIAttemperEngineSink=GET_OBJECTPTR_INTERFACE(pIUnknownEx,IAttemperEngineSink);
if (m_pIAttemperEngineSink==NULL)
{
CEventTrace::ShowEventNotify(TEXT("调度引擎外挂服务接口获取失败,挂接操作失败"),Level_Exception);
return false;
}
return true;
}
没办法,只能去找这个函数在其它哪个文件中被调用了吧
KernelModule/ServiceEngine.cpp
//注册钩子
bool __cdecl CServiceEngine::SetAttemperEngineSink(IUnknownEx * pIUnknownEx)
{
return m_AttemperEngine.SetAttemperEngineSink(pIUnknownEx);
}
可是这边设置的对象还不是我所想看到的,我所要看到的是CenterServer,GameFrameModule,PlazaServer三者其中之一的对象
不过在这里看到亮点了.
只有三个地方有调用这个函数
那就是
1.CenterServer/CenterService.cpp
//开始服务
bool CCenterService::StartService()
{
...
if (m_ServiceEngine->SetAttemperEngineSink(pIAttemperEngine)==false)
...
}
CServiceEngineHelper m_ServiceEngine; //服务引擎
2.GameFremeModule/GameService.cpp
//开始服务
bool _cdecl CGameService::StartService(tagGameServiceParameter * pGameServiceParameter)
{
...
if (m_ServiceEngine->SetAttemperEngineSink(pIAttemperEngine)==false) throw 0;
...
}
CServiceEngineHelper m_ServiceEngine; //服务引擎
3.PlazaServer/PlazaServer.cpp
//开始服务
bool CPlazaService::StartLogonService()
{
...
//注册调度外挂服务
IUnknownEx * pIAttemperEngine=GET_OBJECT_INTERFACE(m_AttemperSink,IUnknownEx);
if (m_ServiceEngine->SetAttemperEngineSink(pIAttemperEngine)==false) throw 0;
...
}
CServiceEngineHelper m_ServiceEngine; //服务引擎
发现了这一点后,哇,原来是这样的呢,哈哈.明白了