下面要介绍的就是第一个示例程序,这个程序的源码已经同GameBsSDK一起发布了,存放位置在$GAMEBS_ROOT\Samples\HelloworldEngineDemo路径下。使用VC6打开工程,就能查看源码并编译运行。($GAMEBS_ROOT是开发包安装的根目录)
在编译运行之前,你需要对VC做适当的配置,参考: 搭建开发环境 。
本程序的目标是要在目标进程,也就是你的游戏进程,显示一个消息框,这个消息框的内容是由主进程(我们自己写的程序)发送的。该消息框运行在目标进程中,其父窗口也是目标进程的窗口,甚至当你的主程序退出时,它仍然正常显示在目标进程中。通过这样一个例子,展示如何通过我们自己的程序控制目标游戏进程。
本程序包含一个对话框工程(HelloworldEngineDemo)和一个用作嵌入引擎的工程(HelloworldEngine)。
HelloworldEngineDemo是通过MFC的对话框工程创建的用户界面,用户的操作从这里发起。它将提供两种方式来完成平台的安装和卸载功能,如图1所示。

图1:CHelloworldEngineDemo用户界面
HelloworldEngine是一个动态库工程。当平台安装后,它将被安装到嵌入容器中,负责接收来自主程序的消息并做出相应的处理。在本例中,当它收到来自主控端的"SayHello"消息时,调用MessageBox显示消息内容。
当安装平台时,函数CHelloworldEngineDemoDlg::OnInstallPlatform() 会被调用。在获得目标进程的窗口句柄后调用SDK的接口CGmbs::InstallPlatform完成平台的安装。
GameBs平台的安装过程是怎样的呢?
通过GameBs平台的 系统架构你可能已经了解到,在主进程端 (Host side)和目标进程端 (Embed side)将会各安装一个容器。容器作为Engine的载体,将通过Engine扩展功能和提供服务。主进程与目标进程的通讯和同步,也可转化为两个容器之间的通讯和同步。
所以平台的安装就是要把两个容器分别安装到目标进程和主进程中。接下来安装系统级的Engine, 例如: EngineManager, 它将负责维护和管理其他的Engine。
PostUserMessage(HANDLE hPlatform, LPCSTR lpEngineName, LPCSTR lpMsgName, PBYTE pData, int nLen, CGmbs::Container TargetCont)
完成消息的发送。这是另一个由GmbsManager提供的接口,用来向某个Engine发送用户消息, 该Engine将在用户消息的处理过程
OnUserMessageProc(LPCSTR lpMsgName, PBYTE pMsgData, int nDataLen)
中进行消息处理。本例中发送的消息名为"SayHello",内容为"Hello world! I am GameBs from host side."。HelloworldEngine收到后弹出MessageBox显示消息内容,如图2所示。

图2:弹出消息框
该Engine将会安装到目标进程的容器中。每个Engine的实体是一个动态库,但对这个动态库有特殊的要求,因为只有满足这些要求它才能够正常运行在容器中。
对Engine的要求包括:
EXPORTS Gmbs_GetEngineInstance
本例的代码很少,HelloworldEngine在收到"SayHello"消息后,调用Win32的函数MessageBox弹出消息框显示来自主控端的内容。
int CHelloworldEngine::OnUserMessageProc(LPCSTR lpMsgName, PBYTE pMsgData, int nDataLen)
{
if (strcmp(lpMsgName, "SayHello") == 0)
{
LPCSTR pMsg = (LPCSTR)pMsgData;
WT_Trace("SayHello: pMsg=%s, nDataLen=%d\n", pMsg, nDataLen);
MessageBox(GetMainWnd(), pMsg, "Helloworld", MB_OKCANCEL);
}
return 0;
}
参数lpMsgName为消息名称,pMsgData为消息数据,nDataLen为消息数据长度。当消息名为"SayHello"时,先调用WT_Trace打印消息内容和长度(仅用作调试),再调用MesssageBox弹出消息框显示消息内容。
调用GetMainWnd()获得嵌入端的主窗口,实际上就是目标进程的主窗口。
WT_Trace是用来打印调试信息的接口,打开PacketDebug会看到它的输出。在基于GameBs平台的开发过程中,PacketDebug是必不可少的打印 和调试工具,尤其在封包的打印和监视处理上,它提供了强大便利的功能。
这个例子演示了我们可以通过主控端的用户界面给嵌入容器的引擎发送消息,因为目标引擎是运行在游戏进程中,它可以获取游戏进程的各种信息,包括内存数据,窗口信息,捕获函数调用等。在后面的例子中将会看到,嵌入引擎可以通过消息把需要的信息发送到主控端,这样主控段的引擎就可以获得游戏进程的各种状态和数据,从而运行在主控端引擎之上的应用程序能够通过对这些数据的分析以及辅助工具的需求,生成相应的策略,从而对游戏进程进行操作或控制。而这正是我们给游戏辅助工具赋予的使命。