DLL становится удаленным, если DLL, который загрузил его, разгружен?

Инициализируйте переменную текущим значением даты, которое у вас есть для других регионов (должно быть в формате даты), и используйте метод .toUTCString().

Пример кода для IST к UTC приведен ниже:

var curdate = new Date("Fri Mar 29 2019 08:00:00 GMT+0530");

var UTCdate = curdate.toUTCString();
8
задан Brian R. Bondy 5 March 2009 в 17:15
поделиться

4 ответа

Нет. DLL_B не будет разгружен. LoadLibrary() назовите сделанными DLL_A увеличит счетчик числа загрузок для DLL_B. С тех пор нет никакого соответствия FreeLibrary() призыв DLL_B, refcount не перейдет к нулю.

От LoadLibrary () документы:

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

11
ответ дан 5 December 2019 в 10:44
поделиться

У Вас будет утечка дескриптора в случае:

Program -Load> Dll A 
          -Load> Dll B 
        -Unload> Dll A

Никакой код неявно не выполнен модулем, разгружаемым для разгрузки модулей, которые он загрузил.

Так как никакой код не выполнен для уменьшения подсчета ссылок, модуль B никогда не будет разгружаться.

Вот правила для загрузки / разгрузка dlls:

  • Каждый вызов к LoadLibrary и LoadLibraryEx увеличит подсчет ссылок для того модуля. Это находится в контексте обработки вызовов только, не через границы процесса.
  • Каждый вызов к FreeLibrary или FreeLibraryAndExitThread постепенно уменьшит подсчет ссылок.
  • Когда подсчет ссылок достигнет 0, он будет разгружен.
  • Когда Windows видит, что Ваша программа закрывается, любые пропущенные разгруженные модули будут затем разгружены.
  • В зависимости от того, что Вы делаете, DllCanUnloadNow мог бы быть полезен для Вас.

Все еще в памяти по сравнению со все еще загруженным:

Нет никакой гарантии, что Ваш модуль будет выпущен из памяти в определенное время, когда ссылка достигнет 0. Но необходимо рассмотреть модуль, как будто он разгружен, когда подсчет ссылок достигает 0.

Мешая DLL быть разгруженным:

Для принуждения DLL то, чтобы быть разгруженным, Вы могли попробовать

  • Системные вызовы DllMain с флагом DLL_PROCESS_DETACH. Вы могли попытаться не возвратиться из этого через некоторую операцию блокирования.
  • Вы могли попытаться назвать LoadLibrary из DLL, который Вы хотите не смочь разгрузить. (Сам загрузка)

Править:

Вы упомянули, что Ваша цель к коду injet в под управлением программу и что Вы хотели пропустить дескриптор нарочно.

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

Можно возвратить FALSE от DllMain, чтобы мешать ему быть загруженными так, чтобы Вы не тратили впустую память. Вы делаете это, когда fdwReason является DLL_PROCESS_ATTACH. Можно читать больше об этом здесь.

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

3
ответ дан 5 December 2019 в 10:44
поделиться

Считайте раздел Remarks для подробного объяснения.

Ключевая вещь отметить:

Система поддерживает подсчет ссылок для каждого процесса для каждого загруженного модуля

и далее вниз

Когда подсчет ссылок модуля достигает нуля, или процесс завершается, система разгружает модуль от адресного пространства процесса

Из MSDN:

Освобождает загруженный модуль динамически подключаемой библиотеки (DLL) и, при необходимости, постепенно уменьшает его подсчет ссылок. Когда подсчет ссылок достигает нуля, модуль разгружен от адресного пространства обработки вызовов, и дескриптор больше не действителен.

1
ответ дан 5 December 2019 в 10:44
поделиться

DLLs в окнах являются считаемой ссылкой. Когда A разгружен, Вы постепенно уменьшаете подсчет ссылок на A, если он поразит нуль, то он разгрузится, и (принимающий ошибки в коде) постепенно уменьшают подсчет ссылок на B. Если refcount на B пойдет для обнуления его, то будет затем разгружен. Это - возможный DLL C, имеет refcount на B, и разгрузка A не разгрузит B.

1
ответ дан 5 December 2019 в 10:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: