微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

LoadLibrary从文件中的偏移量开始

如何解决LoadLibrary从文件中的偏移量开始

| 我正在编写一个可脚本化的游戏引擎,为此我有大量执行各种任务的类。引擎的大小正在迅速增长,因此我考虑将大型可执行文件拆分为dll模块,以便仅包括游戏编写者实际使用的组件。当用户编译他们的游戏(即他们的脚本)时,我希望正确的dll成为最终可执行文件的一部分。我已经有很多覆盖数据,所以我认为我可以将dll存储为该块的一部分。我的问题可以归结为: 是否可以欺骗LoadLibrary以一定的偏移量开始读取文件?这将使我不必将dll解压缩到一个不干净的临时文件中,或者完全取消自动包含dll \并仅指示我的用户将dll \和他们的游戏打包在一起。 最初,我考虑采用“从内存中加载dll”的方法,但由于可移植性而拒绝了它,只是因为它看起来像是一种可怕的黑客手段。 有什么想法吗? 亲切的问候, 菲利普·本纳弗     

解决方法

        您正在尝试解决不存在的问题。加载DLL实际上并不需要任何物理内存。 Windows为DLL内容创建一个内存映射文件。仅当程序调用该代码时,才会加载DLL中的代码。除了保留的内存页面,未使用的代码不需要任何系统资源。在32位操作系统上,您拥有20亿字节的值。您必须编写很多代码才能全部使用,50 MB的机器代码已经是一个非常大的程序。 内存映射也是导致您无法使LoadLibrary()进行所需操作的原因。没有实际需要的场景。 查看链接器的/ DELAYLOAD选项,以提高启动性能。     ,        我认为该任务的所有解决方案都是“可怕的骇客”,仅此而已。 我看到的最简单的方法是创建自己的虚拟驱动器,该驱动器呈现自定义文件系统,并破解从一个实际文件(库的编译)到多个单独的DLL-s的系统访问路径。例如,像TrueCrypt一样(它是开源的)。然后您可以使用
LoadLibrary
功能而无需更改。 但是,我认为唯一正确的方法就是更改您的任务,不要使用这种方法。我认为您需要使用结构,指针等来创建自己的脚本解释器和编译器。 最主要的是,我不了解您从使用库中受益。我认为当前任何已编译的代码都不会带来太大的负担,并且可能打包得很好。任何其他资源都可以在首次调用时动态加载。您要做的就是以正确的方式组织脚本引擎所有组件的工作周期。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?