CComModule :: Unlock (); - PullRequest
       2

CComModule :: Unlock ();

0 голосов
/ 27 мая 2010

Я пытался определить, что делает эта функция, однако я не могу найти ее где-нибудь в документации MSDN класса CComModule.

Может кто-нибудь сказать мне, для чего он используется?

1 Ответ

2 голосов
/ 28 мая 2010

Эта функция для DllCanUnloadNow() для правильной работы.

Вы знаете, что когда вы вызываете CoCreateInstance() для внутрипроцессного сервера, COM автоматически вызывает LoadLibraryEx() для загрузки DLL COM-сервера при необходимости. Но как долго DLL хранится в загруженном состоянии? Фактически COM периодически вызывает DllCanUnloadNow() для каждой загруженной DLL-библиотеки COM-сервера. Если возвращается S_OK COM разрешено звонить FreeLibrary().

Когда безопасно выгружать DLL? Очевидно, вы не сможете выгрузить его, пока все объекты, реализованные в DLL, не будут уничтожены. Итак, вот вам и «счетчик блокировок» - глобальная целочисленная переменная, подсчитывающая количество живых объектов, реализованных DLL.

Когда создается новый COM-объект - CComModule::Lock() вызывается из его конструктора (обычно CComObject конструктор) и увеличивает значение переменной, когда объект уничтожается - CComModule::Unlock() вызывается из его деструктор и уменьшает переменную. Когда CComModule::GetLockCount() возвращает ноль, это означает, что живых объектов нет и выгрузить DLL безопасно.

Таким образом, счетчик блокировок очень похож на счетчик ссылок, реализованный IUnknown. Число ссылок для каждого объекта, число блокировок для каждого внутрипроцессного сервера COM.

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