在dll中保存额外的数据,他们是如何做到的?

时间:2008-11-14 19:13:44

标签: c++ serialization

让我告诉你一些关于这个问题的来源。我一直在玩Serious Sam 2的SDK,这是一个在Serious Engine 2上运行的第一人称射击游戏。这个引擎引入了一个名为MetaData的东西。 MetaData在引擎中用于序列化类,并能够在编辑器环境中编辑它们(Serious Editor 2)。例如,而不是:

class CSomeGameItem : CEntity
{
    public:
    int iHealthToGive;
}

在编辑器中不显示,你会这样做:

meta ver(1) class CSomeGameItem : CEntity _("Some game item")
{
public:
    meta int iHealthToGive; _("Amount of health to give")
}

现在制作关卡时,您可以在关卡中插入“Some game item”实体,然后编辑它所拥有的一个属性。现在,我知道Croteam(所述游戏和引擎的开发者)正在使用额外的编译器(Mdc,元数据编译器)将有关类及其变量的额外信息注入到dll文件中,以使该元数据系统成为可能。有没有人知道他们是怎么做到的?

哦,顺便说一句,meta,ver()和_()关键字在他们的代码中没有#define'd,所以“普通”编译器会忽略它们。

4 个答案:

答案 0 :(得分:1)

如果这个引擎在Windows上运行,那么我想到的一个想法是资源。有一些Windows API可以修改exe或dll的资源内容。此外,API允许从“外部”exe / dll读取资源。这样,额外的编译器会将元数据作为资源存储在已编译的exe中。开发工具包将从“base”exe / dll中读取metad数据。

现在,我之前对这些东西很敏感,所以我可能距它的实际工作方式还有几年的时间。

答案 1 :(得分:1)

要获得明确的答案,请研究PE File Format。这是Win32上二进制文件的低级文件格式。即。 DLL,EXE,COM等

有很多书描述了PE文件的布局和功能。还有许多工具可供您探索。

简短的回答是,在最低级别,PE文件格式允许您将数据嵌入到可在运行时提取的二进制文件中。 DLL和Exe通常会嵌入他们的图标和本地化文本。这些通常被称为资源。

一个好的起点是MSDN上的Resource File部分。还研究“资源脚本(* .rc文件)”和“资源编译器(rc.exe)”。

答案 2 :(得分:0)

这看起来有点类似于Qt的moc(元对象编译器)。在Qt的情况下,它生成额外的C ++源文件,然后将其与原始源文件一起编译和链接。

您的示例中可能的实现是生成的文件实现一组函数,可以调用这些函数来获取额外信息,设置属性等等。

答案 3 :(得分:0)

这里只是一个黑暗的刺,因为我从来没有看过sdk,但我猜测有两个传递系统发生 - 一次使用C ++编译器,一次使用自定义元数据处理器查找元标记并处理关联的类名,实例成员名和_()标记。可能会创建某种配置文件,并且可以保留在侧面,也可以作为资源文件嵌入。自定义元数据传递也可以只是一个C ++代码生成器,它创建代码以启用每个类的伪反射。