Загрузка DLL, которая вызывает функции, в DLL, которая ее загрузила - PullRequest
2 голосов
/ 08 декабря 2010

У меня есть DLL, которая будет загружена программой, и эта DLL, в свою очередь, загрузит другую DLL для обработки некоторых вещей, которых не должно быть в основной DLL. Однако вторая DLL должна иметь возможность общаться с первой DLL. Возможно ли для DLL использовать экспортированные функции в той DLL, которая ее загрузила? Например

  1. Программа загружает DLL A с помощью LoadLibrary.
  2. DLL A загружает DLL B с помощью LoadLibrary.
  3. DLL A вызывает некоторые функции в DLL B с помощью GetProcAddress.
  4. B, в свою очередь, выполняет GetProcAddress для DLL A и вызывает некоторые функции.
  5. DLL A подключается к основной программе, поскольку DLL B выполняет какие-то действия и вызывает экспортированные функции DLL A.

Будет ли это работать, и это правильный способ сделать это?

Ответы [ 3 ]

5 голосов
/ 08 декабря 2010

Да, это будет работать.DLL B может безопасно вызывать LoadLibrary для DLL A, чтобы получить дескриптор экземпляра для вызова GetProcAddress нужной ей функции.Загрузчик модулей выяснит, что DLL A уже находится в памяти процесса, и просто вернет дескриптор экземпляра для нее в DLL B.

Примечание : хотя есть определенные предостережения с версионированием,когда основная программа зависит и загружает одну версию DLL A, а DLL B нужна другая версия.В этом случае DLL B должна вызывать LoadLibrary с явным путем к нужной ей версии DLL A, а DLL A должна поддерживать SxS для поддержки загрузки двух ее версий в память процесса.

Самый простой способ избежать этого, если вы контролируете как процесс, так и DLL B, чтобы всегда обеспечивать / использовать одну и ту же версию DLL A.

0 голосов
/ 08 декабря 2010

Да, это будет работать (у меня была похожая ситуация с коммерческим продуктом, над которым я работал много лет назад).Тем не менее, это кошмар с половиной.Я бы предложил изменить структуру вашей библиотеки, чтобы избежать циклической зависимости.Обратные вызовы или создание другой библиотеки, которая будет маршалировать между двумя другими, будут работать и значительно облегчат вашу жизнь в будущем.Проблемы с версиями - только вершина айсберга;Проблемы отладки в архитектуре с циклической зависимостью могут вызвать головную боль.

0 голосов
/ 08 декабря 2010

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

...