代码之家  ›  专栏  ›  技术社区  ›  Aistina

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

  •  0
  • Aistina  · 技术社区  · 17 年前

    让我告诉你一点这个问题是从哪里来的。我一直在玩严肃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文件中注入关于类及其变量的额外信息,使这个元数据系统成为可能。有人知道他们是怎么做到的吗?

    4 回复  |  直到 17 年前
        1
  •  2
  •   kervin    17 年前

    PE File Format . 这是Win32上二进制文件的低级文件格式。即DLL、EXE、COM等。

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

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

        2
  •  1
  •   Serge Wautier    17 年前

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

    现在,我以前对这种东西还不太熟悉,所以我可能离它的实际工作原理还有几光年的距离。

        3
  •  0
  •   CesarB    17 年前

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

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

        4
  •  0
  •   Salman A    17 年前

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

    推荐文章