Как вы знаете, если при вызове LoadLibrary указан модуль DLL, уже сопоставленный с адресным пространством вызывающего процесса, функция просто возвращает дескриптор библиотеки DLL и увеличивает счетчик ссылок модуля.
Где-то мне нужно получить счетчик ссылок на dll. Как получить подсчет ссылок DLL? Как узнать где была загружена dll? Спасибо.
Я погуглил и нашел эту статью , которая утверждает, что дает ответ. Извините, я не мог быть более полезным:
Если это не программный способ (спасибо C.Johnson за то, что дал такую перспективу), WinDBG может быть полезен
http://windbg.info/doc/1-common-cmds.html#10_modules
Посмотрите на !dll и их варианты.
!dll - все загруженные модули с load count
EDIT 2:
Если вы хотите узнать, откуда загружаются все DLL из процесса, есть два способа:
a. Посмотрите на команду
"bu kernel32!LoadLibraryExW ";as /mu ${/v:MyAlias} poi(@esp+4); .if ( $spat( \"${MyAlias}\", \"MYDLL\" ) != 0 ) { kn; } .else { g }" "
в вышеуказанном URL
б. Запустите процесс под WinDBG. Debug->Even Filter и выберите "Load Module" и установите значение "Enabled" в разделе "Execution". В разделе "Продолжить" установите значение "Не обрабатывается".
Одно из этого должно вам точно помочь.
На самом деле эта информация недоступна через общедоступный API. Каков ваш сценарий? Запуск AppVerifier выявит любые ошибки, которые вы допустили с дескрипторами модулей (или любых других).
Я не уверен, что вы полностью понимаете, как должна работать LoadLibrary/FreeLibrary
. Вы вызываете FreeLibrary
, когда закончите с ним, и это уменьшит счетчик ссылок, который был увеличен при его загрузке. Если какая-то другая часть вашего процесса все еще использует его, это, вероятно, не ваша забота.
Счетчик ссылок может сказать вам, сколько раз он был «загружен», но не поможет выяснить, кто его загрузил.