Как общаться между двумя DLL, загруженными одним и тем же процессом, не загружая их снова? - PullRequest
0 голосов
/ 30 января 2020

Я хочу общаться между двумя плагинами в приложении. Оба плагина являются C ++ COM DLL. Давайте назовем их DLL1 и DLL2.

В DLL1 я создал экземпляр класса COM, который загружает библиотеку COM. Из DLL2 я могу создать аналогичный экземпляр этого класса COM, который может снова загрузить эту библиотеку COM.

По сути, я не хочу загружать эту библиотеку COM снова из DLL2 и каким-то образом получить дескриптор этого COM DLL, которая уже загружена DLL1. Могу ли я вызвать функцию, присутствующую в COM DLL (которая загружается DLL1) из DLL2, не загружая ее снова?

Здесь есть ограничение: я не хочу загружать COM DLL из DLL2. Он будет загружен DLL1, и я просто хочу выполнить эту функцию COM DLL из DLL2.

1 Ответ

1 голос
/ 30 января 2020

Из документации LoadLibrary :

Система ведет подсчет ссылок для каждого загруженного модуля. Вызов LoadLibrary увеличивает счетчик ссылок. Вызов функции FreeLibrary или FreeLibraryAndExitThread уменьшает счетчик ссылок. Система выгружает модуль, когда его счетчик ссылок достигает нуля или когда процесс завершается (независимо от счетчика ссылок).

и

Если указанный модуль является DLL еще не загружен для вызывающего процесса , система вызывает функцию DllMain библиотеки DLL со значением DLL_PROCESS_ATTACH. Если DllMain возвращает TRUE, LoadLibrary возвращает дескриптор модуля. Если DllMain возвращает FALSE, система выгружает DLL из адресного пространства процесса, а LoadLibrary возвращает NULL.

Таким образом, двойной вызов LoadLibrary("XXX.dll") в одном и том же процессе приведет только к загрузке библиотеки один раз , второй вызов должен вернуть тот же дескриптор модуля.

...