Сущность технологии COM




Снова о времени жизни сервера - часть 2


void UnlockModule(void) { if (InterlockedDecrement(&g_cLocks) ==0) { extern HANDLE g_heventShutdown; SetEvent(g_heventShutdown); } }

Если вместо серверного основного потока обслуживается очередь событий Windows MSG, то для прерывания цикла обработки сообщений следует использовать некоторые из API-функций. Проще всего использовать PostThreadMessage для передачи в основной поток сообщения WM_QUIT:

void UnlockModule(void) { if (InterlockedDecrement(&g_cLocks) == 0) { extern DWORD g_dwMainThreadID; // set from main thread // установлено из основного потока PostThreadMessage(g_dwMainThreadID, WNLQUIT, О, 0); } }

Если серверный процесс на основе STA знает, что он никогда не будет создавать дополнительные потоки, то он может использовать несколько более простую API-функцию PostQuitMessage:

void UnlockModule(void) { if (InterlockedDecrement(&g_cLocks) == 0) PostQuitMessage(0); }

Этот способ работает только при вызове из главного потока серверного процесса.

Второе различие в управлении временем жизни внутрипроцессного и внепроцессного сервера связано с тем, что должно поддерживать сервер в загруженном или работающем состоянии. В случае внутрипроцессного сервера такой силой обладают неосвобожденные ссылки на объекты и неотмененные вызовы IClassFactory::LockServer(TRUE). Неосвобожденные ссылки на объекты необходимо рассмотреть в контексте внепроцессного сервера.

Безусловно, сервер должен оставаться доступным до тех пор, пока внешние клиенты имеют неосвобожденные ссылки на объекты класса сервера. Для внутрипроцессного сервера это реализуется следующим образом:

STDMETHODIMP_(ULONG) MyClassObject::AddRef(void) { LockModule(); // note outstanding reference // отмечаем неосвобожденную ссылку return 2; // non-heap-based object // объект, размещенный не в "куче" }

STDMETHODIMP_(ULONG) MyClassObject::Release(void) { UnlockModule(); // note destroyed reference // отмечаем уничтоженную ссылку return 1; // non-heap-based object // объект, размещенный не в "куче" }




Содержание  Назад  Вперед