Загрузите два экземпляра одной и той же DLL в Delphi - PullRequest
4 голосов
/ 20 апреля 2010

Вот моя проблема: я хотел бы создать два отдельных экземпляра одной и той же DLL.

Следующее не работает, потому что Handle1 и Handle2 получат один и тот же адрес

  Handle1 := LoadLibrary('mydll.dll');
  Handle2 := LoadLibrary('mydll.dll');

Следующее работает, но я должен сделать копию DLL и переименовать ее во что-то другое (что кажется немного глупым)

  Handle1 := LoadLibrary('mydll.dll');
  Handle2 := LoadLibrary('mydll2.dll');

Есть ли способ иметь только один файл DLL, но загрузить несколько его экземпляров?

Ответы [ 3 ]

3 голосов
/ 20 апреля 2010

Я не думаю, что это возможно.

Вы должны написать .exe, который загружает DLL. Затем вы можете охватить несколько процессов (.exe), и каждый будет запускать свой собственный экземпляр библиотеки DLL. Вам придется использовать методы IPC (межпроцессное взаимодействие) для связи с .exes. Конечно, выполнимо, но не совсем понятно.

1 голос
/ 21 апреля 2010

Он не будет работать с LoadLibrary, потому что Windows проверяет, была ли уже загружена dll, и будет возвращать один и тот же дескриптор снова и снова.

У меня есть некоторый код, который изначально предназначался для загрузки библиотеки DLL из ресурса, привязанного к исполняемому файлу, но я думаю, что можно было бы сделать то же самое для области памяти, которая была заполнена содержимым файла. Я не вижу причин, по которым он не будет работать дважды, но я не проверял его.

Вы можете найти его здесь: http://svn.berlios.de/viewvc/dzchart/utilities/dzLib/trunk/src/u_dzResourceDllLoader.pas?view=markup

Это часть моей библиотеки dzlib, которая доступна под MPL.

0 голосов
/ 20 апреля 2010

Windows XP представила параллельное выполнение для Win32 DLL ( эти парни много знают об этом).

Имея множество обручей, вы можете теперь:

...