Загрузите одну и ту же DLL несколько раз

Я хочу загрузить ту же DLL, например Lib.dll несколько раз!

-> нужно создать новый процесс (функция CreateProcess) для каждого LoadLibrary!

У кого-нибудь есть пример или какие-то намеки ?!

Thx и приветствует

6

Решение

Похоже, вы хотите, чтобы каждый экземпляр DLL имел отдельные сегменты данных. Это единственная причина, по которой я могу придумать вопрос.

Единственный способ добиться этого — убедиться, что каждый раз, когда вы звоните LoadLibrary, DLL имеет другое имя файла. Скопируйте DLL во временный файл каждый раз, когда вам нужно загрузить его, убедившись, что используемое имя отличается от любого загруженного экземпляра DLL.

Я повторяю комментарии выше, которые побуждают вас переделывать архитектуру системы.

10

Другие решения

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

Исходя из ваших комментариев, DLL делает разные вещи в зависимости от одного из вызовов функций, поэтому вам нужно будет использовать «сеансовую» систему, в которой вы храните отдельные наборы данных для каждого и создаете их по мере необходимости (посредством другого вызова) и передаете дескриптор или аналогично каждому вызову функции. Именно так работает большинство Win32 API (дескрипторы файлов, дескрипторы окон, объекты GDI и т. Д.)

Если вы сделаете DLL хостом COM и будете использовать объекты COM, это будет автоматически обрабатываться каждым экземпляром класса.

Если вы хотите использовать отдельный процесс, то вы можете сделать это, запустив новый процесс просто для размещения библиотеки DLL и использования одной из многих форм IPC для связи с ней.

5

Вы рассматриваете DLL как экземпляр объекта. Это совсем не так, как работают DLL. DLL не являются объектами, они представляют собой набор кода и ресурсов. Эти вещи не меняются, независимо от того, сколько раз вы могли теоретически загрузить DLL. Таким образом, не было бы никакого смысла в том, чтобы несколько экземпляров DLL загружались в одном и том же процессе.

Это отличный пример того, почему глобальные переменные являются плохой идеей. Данные должны быть в состоянии быть созданы по мере необходимости.

Поэтому, если вам нужно несколько экземпляров объекта для работы, вы должны спроектировать DLL, чтобы сделать именно это. Как уже говорили другие, какой-то сеанс или просто какой-то объект, который вы можете создать, когда захотите.

Это абстрактный ответ на абстрактный вопрос. Было бы очень полезно, если бы вы могли объяснить больше о том, что именно делает эта DLL, и зачем вам нужно несколько ее экземпляров.

4
По вопросам рекламы [email protected]