Проблема запуска программы с DLL, встроенной в качестве ресурса - PullRequest
4 голосов
/ 29 апреля 2009

Я сделал About.com руководство по внедрению DLL в Delphi EXE EXE, которое, кажется, работает, пока я фактически не использую DLL в качестве внешней функции. В любом случае можно ли получить код, с которым я связан, работать раньше, чем модуль, на который есть ссылка в пункте использования.
Я пробовал:

  • В точности то, что говорит этот код.
  • Размещение этого кода в разделе инициализации формы, в которой используется модуль, использующий внешние функции.
  • Размещение этого кода в разделе инициализации устройства, использующего внешние функции.

И под внешними функциями я имею в виду функцию, которая выглядит следующим образом:

function MyFunction: Integer; stdcall; external 'fundll.dll';

Проблема, которую я получаю, заключается в том, что обычный файл 'fundll.dll' не может быть загружен (потому что его нет в каталоге). Код Zarko работает (довольно мило, он создает DLL в этой папке), когда код заходит так далеко. Но он просто падает до того, как проект начинает работать, когда я использую нужные мне внешние функции.

Ответы [ 3 ]

6 голосов
/ 29 апреля 2009

Вы не можете сделать это с внешними функциями - используйте LoadLibrary () и GetProcAddress () вместо извлечения DLL, и все должно работать.

Причина в том, что любой код будет выполняться только после того, как загрузчик ОС разрешит все точки входа. Вид проблемы с курицей и яйцом, если хотите.

4 голосов
/ 02 мая 2009

Если вы собираетесь использовать LoadLibrary () и GetProcAddress (), вы можете предпочесть использовать BTMemoryModule, который позволит вам использовать DLL, встроенную в качестве ресурса, без сохранения ее в файловой системе (которую пользователь, возможно, не сможет делать, в зависимости от безопасности машины).

http://www.jasontpenny.com/blog/2009/05/01/using-dlls-stored-as-resources-in-delphi-programs/

3 голосов
/ 29 апреля 2009

если вы хотите вызвать функцию в ней, у вас есть два варианта ...

1) использовать метод exe / dll вместо метода ресурса. 2) не ссылаться на библиотеку с помощью внешнего объявления стиля. вместо этого используйте LoadLibrary, GetProcAddress и т. д. для ссылки на функцию, которую нужно вызвать.

метод ресурса и объявление функции как внешней не будут смешиваться. Windows хочет связать ваш исполняемый файл с DLL в памяти до ваш код работает для извлечения DLL.

...