Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在dll中保存额外数据,他们是如何做到的?_C++_Serialization - Fatal编程技术网

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

C++ 在dll中保存额外数据,他们是如何做到的?,c++,serialization,C++,Serialization,让我告诉你一点这个问题是从哪里来的。我一直在玩严肃Sam2的SDK,它是在严肃引擎2上运行的第一人称射击游戏。这个引擎引入了一种称为元数据的东西。元数据在引擎中用于序列化类,并能够在编辑器环境中编辑它们(严重编辑器2)。因此,例如,代替: class CSomeGameItem : CEntity { public: int iHealthToGive; } 将不会显示在编辑器中,您可以执行以下操作: meta ver(1) class CSomeGameItem : CEnt

让我告诉你一点这个问题是从哪里来的。我一直在玩严肃Sam2的SDK,它是在严肃引擎2上运行的第一人称射击游戏。这个引擎引入了一种称为元数据的东西。元数据在引擎中用于序列化类,并能够在编辑器环境中编辑它们(严重编辑器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")
}
现在,在制作关卡时,您可以在关卡中插入一个“某个游戏项目”实体,并编辑它拥有的一个属性。现在,我知道Croteam(上述游戏和引擎的开发人员)正在使用一个额外的编译器(Mdc,元数据编译器)向dll文件中注入关于类及其变量的额外信息,使这个元数据系统成为可能。有人知道他们是怎么做到的吗


哦,顺便说一句,meta、ver()和#()关键字在它们的代码中被定义为空,所以“普通”编译器会忽略它们。

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


现在,我以前从未听说过这种东西,所以我可能离它的实际工作原理还有几光年的距离。

要得到一个明确的答案,请研究一下。这是Win32上二进制文件的低级文件格式。即DLL、EXE、COM等

有许多书描述了PE文件的布局和特点。还有许多工具可以让你探索它

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


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

这看起来有点类似于Qt的moc(元对象编译器)。在QT的情况下,它生成额外的C++源文件,然后与原始源文件一起编译并链接。
在您的示例中,一个可能的实现是生成的文件实现一组函数,可以调用这些函数来获取额外信息、设置属性等等。

这里只是一个暗中操作,因为我从未看过sdk,但我猜,有两个系统通过一次,一个是C++编译器,一次是一个定制的元数据处理器,可以查找元标签并处理相关的类名、实例成员名和()标签。可能创建了某种配置文件,或者放在一边,或者作为资源文件嵌入。自定义元数据传递也可以是C++代码生成器,它生成代码以实现对每个类的伪反射。