STDMETHODIMP Monitor::StartMonitoring(void) { // ensure that stub manager/object stays alive // убеждаемся, что администратор заглушек/объект остается жив
HRESULT hr = CoLockObjectExternal(this, TRUE, FALSE);
// start hardware monitoring // начинаем контроль за аппаратным устройством
if (SUCCEEDED(hr)) hr = this->EnableHardwareProbe();
return hr; }
а также другой метод, который предписывает объекту закончить активный контроль:
STDMETHODIMP Monitor::StopMonitoring(void) { // stop hardware monitoring // прекращаем контроль за устройством
this->DisableHardwareProbe();
// allow stub manager/object to die when no clients exist // разрешаем администратору заглушек/объекту прекратить // существование, когда нет клиентов
hr = CoLockObjectExternal(this, FALSE, TRUE);
return hr; }
Если принять, что объект был изначально маршалирован с помощью слабой таблицы маршалинга, то данный код обеспечивает жизнь администратора заглушек и объекта до тех пор, пока хотя бы один неосвобожденный заместитель или объект активно контролируют основное устройство.
Кроме предоставления разработчикам объектов возможности устанавливать счетчик внешних ссылок в администраторе заглушек, СОМ также позволяет разработчикам явно уничтожать администратор заглушек, независимо от числа неосвобожденных объектных ссылок. В СОМ предусмотрена API-функция CoDisconnectObject, которая находит администратор заглушек объекта и уничтожает его, отсоединяя все существующие в данный момент заместители:
HRESULT CoDisconnectObject( [in] Unknown * pUnkObject, // ptr to object // указатель на объект [in] DWORD dwReserved // reserved, must be zero // зарезервировано, должно равняться нулю );