LoadLibrary来自文件中的偏移量

时间:2011-05-29 15:47:44

标签: windows dll loadlibrary

我正在编写一个可编写脚本的游戏引擎,我有大量的类可以执行各种任务。引擎的大小正在快速增长,因此我想到将大型可执行文件拆分为dll模块,以便只包含游戏编写者实际使用的组件。当用户编译他们的游戏(也就是说他们的脚本)时,我希望正确的dll成为最终可执行文件的一部分。我已经有了很多叠加数据,所以我想我可以将dll存储为这个块的一部分。我的问题归结为:

是否可以欺骗LoadLibrary以某个偏移量开始读取文件?这样我就不必将dll提取到一个不干净的临时文件中,或者完全取消dll的自动包含,并简单地指示我的用户将dll与他们的游戏打包在一起。

最初我想过去“从内存加载dll”的方法,但是基于可移植性拒绝它,仅仅是因为它看起来像是一个可怕的黑客。

有什么想法吗?

亲切的问候,

Philip Bennefall

2 个答案:

答案 0 :(得分:2)

您正在尝试解决不存在的问题。加载DLL实际上不需要任何物理内存。 Windows为DLL内容创建内存映射文件。当程序调用该代码时,DLL中的代码才会被加载。未使用的代码不需要除保留内存页之外的任何系统资源。在32位操作系统上,你有20亿字节。您必须编写一个 lot 代码才能全部使用它们,50兆字节的机器代码已经是一个非常大的程序。

内存映射也是您无法使LoadLibrary()执行您想要执行的操作的原因。没有你需要的现实场景。

查看链接器的/ DELAYLOAD选项以提高启动性能。

答案 1 :(得分:1)

我认为该任务的每个解决方案都是“可怕的黑客攻击”,仅此而已。

我看到的最简单的方法是创建自己的虚拟驱动器,它呈现自定义文件系统并破解从一个真实文件(编译库)到多个独立DLL的系统访问路径。例如像TrueCrypt那样(它是开源的)。而且您可以使用LoadLibrary函数而无需更改。

但我认为只有正确的方法是改变你的任务,不要使用这种方法。我认为您需要使用结构,指针等创建自己的脚本解释器和编译器。

主要的是我不了解您使用库的好处。我认为当前时间的任何编译代码都不会那么重,而且可能非常好。可以在第一次调用时动态加载任何其他资源。您需要做的就是以正确的方式组织脚本引擎的所有组件的工作周期。