【发布时间】:2011-05-29 15:47:44
【问题描述】:
我正在编写一个可编写脚本的游戏引擎,为此我有大量执行各种任务的类。引擎的大小正在迅速增长,因此我想将大型可执行文件拆分为 dll 模块,以便仅包含游戏编写者实际使用的组件。当用户编译他们的游戏(也就是说他们的脚本)时,我希望正确的 dll 成为最终可执行文件的一部分。我已经有相当多的覆盖数据,所以我想我也许可以将 dll 存储为这个块的一部分。我的问题归结为:
是否可以欺骗 LoadLibrary 以某个偏移量开始读取文件?这将使我不必将 dll 提取到一个不干净的临时文件中,或者完全取消自动包含 dll 并简单地指示我的用户将 dll 与他们的游戏一起打包。
最初我想采用“从内存中加载 dll”的方法,但以可移植性为由拒绝了它,只是因为它看起来像一个可怕的 hack。
有什么想法吗?
亲切的问候,
菲利普·班纳法尔
【问题讨论】:
-
您似乎在描述一个非常复杂的静态链接改造。这就是静态链接的全部意义——包括可执行文件中库代码的必要部分。
-
嗯,这几乎是我想做的,但必须根据脚本内容来完成。因此,我无法预编译它,因为这会导致我回到现在的位置。当用户“编译”他们的游戏时,发生的并不是真正的 C++ 编译。它只是编译自己的相当高级字节码的脚本引擎。然后将此字节码加密并附加到引擎可执行文件的副本中,该可执行文件在开始执行时检查它是否附加了适当的覆盖数据。
-
听起来您需要一个工具来确定引擎的哪些部分已使用和未使用,然后使用实际的链接器或您自己的工具适当地重新链接引擎可执行文件重新处理文件。
-
你能推荐任何这样的工具吗?
-
对不起,这不是我最近需要为windows平台研究的东西。您的第一个决定可能是让开发人员重新链接引擎,或者想办法从您提供的已链接的可执行文件中删除不需要的部分。
标签: windows dll loadlibrary