Дважды загрузить dll в одном процессе?

user237
Дата: 26.11.2007 11:58:03
Возможно ли такое?
Есть компонент в x.dll, его использует основная форма.
Есть дополнительная форма, также в dll.
Дополнительная форма также подгружает x.dll, и использует компонент.
На данный момент имею одну библиотеку под двумя разными именами,
и подгружаю по необходимости.
Можно доработать компонент, и создавать его из одной библиотеки на разных формах,
но пока вопрос о возможности дважды загрузить dll в одном процессе.
Infernal V. Raven
Дата: 26.11.2007 13:04:28
нельзя
Альт
Дата: 26.11.2007 13:10:29
можно... если я правильно понял вопрос... в том случае, что функционал LoadLibrary вы реализуете самостоятельно... прогуляйтесь в поиск или гугль на тему BTMemoryModule
Infernal V. Raven
Дата: 26.11.2007 13:13:50
Альт
можно... если я правильно понял вопрос... в том случае, что функционал LoadLibrary вы реализуете самостоятельно... прогуляйтесь в поиск или гугль на тему BTMemoryModule
хм, т.е. подменить системную функцию из kernel. Можно конечно все сделать и код на асме написать - но какой смысл?
Альт
Дата: 26.11.2007 13:20:48
Infernal V. Raven
Альт
можно... если я правильно понял вопрос... в том случае, что функционал LoadLibrary вы реализуете самостоятельно... прогуляйтесь в поиск или гугль на тему BTMemoryModule
хм, т.е. подменить системную функцию из kernel. Можно конечно все сделать и код на асме написать - но какой смысл?


например: "возможность дважды загрузить dll в одном процессе"...
вы получаете три функции... похожие на стандартные...
  
  function  MemoryLoadLibary( const pData : Pointer; const iSize : Int64 ) : HMEMORYMODULE;
  function  MemoryGetProcAddress( const pModule : HMEMORYMODULE; const sName : String ) : FARPROC;
  procedure MemoryFreeLibrary( var pModule : HMEMORYMODULE );

но оперирующими с библиотеками уже по вашим правилам, а как использовать это преимущество... уже дело конкретного разработчика...
Infernal V. Raven
Дата: 26.11.2007 13:43:10
Как вариант - рассмотреть стоит. На мой взгляд я думаю что целесообразней сделать функцию MyLoadLibrary - в которой проверять, загружена ли библиотека. Тоже самое с выгрузкой
---
aka VIR. No pity. No mercy. No remorse. No Regret
user237
Дата: 26.11.2007 14:29:27
Тоесть, если я правильно понял, стандартных средств в Windows нет.
В BTMemoryModule, при условии что dll уже в памяти,
копирует адресное пространство библиотеки, и устанавливает
новые метки на процедуры.
Буду пробовать. Спасибо огромное за быстрый и качественный ответ!
sqvidler
Дата: 26.11.2007 18:45:35
Для начала - DLL своя?
Если своя - сделать в ней функцию инициализации и при каждом её вызове создавать новый экземпляр "компонента".
Ну и почистить либу от глобальных переменных.
StarWind
Дата: 27.11.2007 02:56:27
Странно... не, я конечно может не понял вопроса, раз все предлагают такие сложности... У меня блевотека загружается столько раз, сколько мне нужно, внутри нее создается класс, который работает, внутри нее работает поток и все в порядке. Никакие проверки не нужны дополнительные. Количество вызовов LoadLibrary операционка считает сама. Единственная тонкость на которую я налетел, область данных остается одна и та же, соответственно глобальные переменные одни и те же. Но это решается не просто, а ОЧЕНЬ просто.
user237
Дата: 27.11.2007 06:36:13
Библиотека своя.
Глобальных переменных и правдо много,
да еше большой массив в котором временные даные хранятся.
Поток с threadvar использовать можно,
да и сам компонент довести до ума теоретически не сложно.
Просто стало интересно как подгрузить библиотеку дважды.
В Delphi, по LoadLibrary и LoadModule почитал, ничего похожего нет.
В google тоже похожего не нашел.
BTMemoryLoadLibary сейчас изучаю, как вариант меня пока вполне устраивает.
Всем спасибо за помощь и внимание к вопросу!