LoadLibrary из смещения в файл - PullRequest
2 голосов
/ 29 мая 2011

Я пишу скриптовый игровой движок, для которого у меня есть большое количество классов, которые выполняют различные задачи. Размер движка быстро растет, и поэтому я подумал о том, чтобы разбить большой исполняемый файл на модули dll, чтобы в него могли быть включены только те компоненты, которые фактически использует создатель игры. Когда пользователь компилирует свою игру (то есть свой сценарий), я хочу, чтобы правильные библиотеки DLL были частью окончательного исполняемого файла. У меня уже есть довольно много оверлейных данных, поэтому я решил, что смогу сохранить dll как часть этого блока. Мой вопрос сводится к этому:

Можно ли обмануть LoadLibrary, чтобы начать чтение файла с определенным смещением? Это избавило бы меня от необходимости извлекать dll во временный файл, который не является чистым, или, в качестве альтернативы, полностью исключать автоматическое включение dll и просто инструктировать моих пользователей упаковывать dll вместе со своими играми.

Вначале я думал о подходе "загрузить dll из памяти", но отверг его из-за переносимости и просто потому, что это кажется таким ужасным взломом.

Есть мысли?

С уважением,

Филипп Беннефолл

Ответы [ 2 ]

2 голосов
/ 19 июня 2011

Вы пытаетесь решить проблему, которой не существует. Загрузка DLL фактически не требует физической памяти. Windows создает файл отображения памяти для содержимого DLL. Код из DLL загружается только тогда, когда ваша программа вызывает этот код. Неиспользуемый код не требует никаких системных ресурсов, кроме зарезервированных страниц памяти. У вас есть 2 миллиарда байтов этого в 32-битной операционной системе. Вы должны написать много кода, чтобы использовать их все, 50 мегабайт машинного кода - это уже очень большая программа.

Отображение памяти также является причиной, по которой вы не можете заставить LoadLibrary () делать то, что вы хотите. Там нет реалистичного сценария, где вам нужно.

Просмотрите параметр компоновщика / DELAYLOAD, чтобы улучшить производительность при запуске.

1 голос
/ 19 июня 2011

Я думаю, что каждое решение для этой задачи - «ужасный взлом» и ничего более.

Самый простой способ, который я вижу, это создать свой собственный виртуальный диск, который представляет пользовательскую файловую систему и взламывает путь доступа к системе от одного реального файла (компиляция ваших библиотек) к нескольким отдельным DLL-библиотекам. Например, как TrueCrypt (это с открытым исходным кодом). И чем вы можете использовать LoadLibrary функцию без изменений.

Но единственный правильный способ, которым я вижу, - это изменить свою задачу и не использовать этот подход. Я думаю, вам нужно создать свой собственный интерпретатор сценариев и компилятор, используя структуры, указатели и т. Д.

Главное, что я не понимаю вашей выгоды от использования библиотек . Я думаю, что любой скомпилированный код в настоящее время не так много весит и может быть упакован очень хорошо. Любые другие ресурсы могут быть загружены динамически при первом вызове. Все, что вам нужно сделать, это правильно организовать рабочие циклы всех компонентов механизма сценариев.

...