Загрузите два экземпляра одной и той же DLL в Delphi
Вот моя проблема: я хотел бы создать два отдельных экземпляра одной и той же DLL.
Следующее не работает, потому что Handle1 и Handle2 получат один и тот же адрес
Handle1 := LoadLibrary('mydll.dll');
Handle2 := LoadLibrary('mydll.dll');
Следующее работает, но я должен сделать копию DLL и переименовать ее во что-то другое (что кажется немного глупым)
Handle1 := LoadLibrary('mydll.dll');
Handle2 := LoadLibrary('mydll2.dll');
Есть ли способ иметь только один файл DLL, но загрузить несколько его экземпляров?
3 ответа
Я не думаю, что это возможно.
Вы должны написать.exe, который загружает DLL. Затем вы можете охватить несколько процессов (.exe), и каждый будет запускать свой собственный экземпляр библиотеки DLL. Вам придется использовать методы IPC (межпроцессное взаимодействие) для связи с.exes. Конечно, выполнимо, но не совсем понятно.
Он не будет работать с LoadLibrary, потому что Windows проверяет, была ли DLL уже загружена, и будет возвращать один и тот же дескриптор снова и снова.
У меня есть некоторый код, который изначально предназначался для загрузки библиотеки DLL из ресурса, привязанного к исполняемому файлу, но я думаю, что можно было бы сделать то же самое для области памяти, которая была заполнена содержимым файла. Я не вижу никакой причины, почему это не сработало бы дважды, но я не проверял это.
Вы можете найти его здесь: http://svn.berlios.de/viewvc/dzchart/utilities/dzLib/trunk/src/u_dzResourceDllLoader.pas?view=markup
Это часть моей библиотеки dzlib, которая доступна под MPL.
Windows XP представила параллельное выполнение для Win32 DLL ( эти парни много знают об этом).
С большим количеством обручей вы можете теперь:
- дважды загрузить одну и ту же Win32 DLL с одного и того же пути в память
- загружать разные версии одной и той же DLL в память