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




Активация и SCM - часть 6


// notify the SCM // извещаем SCM hr = CoResumeClassObjects(); assert(SUCCEEDED(hr)); // keep process alive until event is signaled // сохраняем процессу жизнь, пока событие не наступило extern HANDLE g_heventShutdown; WaitForSingleObject(g_heventShutdown, INFINITE); // remove entries from COM library's class table // удаляем элементы из таблицы класса библиотеки COM for (int n = 0; n < 3; n++) CoRevokeClassObject(rgdwReg[n]); // leave the MTA // покидаем MTA CoUninitialize(); return 0; }

В данном фрагменте кода предполагается, что событие (Win32 Event object) будет инициализировано где-нибудь еще внутри процесса таким образом:

HANDLE g_heventShutdown = CreateEvent(0, TRUE, FALSE, 0);

Имея данное событие, сервер может быть мирно остановлен с помощью вызова API-функции SetEvent:

SetEvent(g_heventShutdown);

которая запустит последовательность выключения в главном потоке. Если бы сервер был реализован как сервер на основе STA, то главный поток должен был бы вместо ожидания события Win32 Event запустить конвейер обработки оконных сообщений (windows message pump). Это необходимо для того, чтобы позволить поступающим ORPC-запросам входить в апартамент главного потока.

1

Хорошо реализованные серверы проверяют также наличие -RegServer и -UnregServer. Все четыре ключа не зависят от регистра (case).

2

В зависимости от того, как класс сконфигурирован в локальном регистре, регистрация серверного процесса может обратиться ко всем клиентским процессам или только к тем клиентским процессам, которые выполняются с тем же мандатом защиты и/или с той же windows-станцией.

3

Для метода CreateInstance технически осуществимо обеспечить принудительное создание объекта в определенном апартаменте с использованием стандартных технологии мультиапартаментного программирования. Однако фактическая реализация CreateInstance просто обрабатывает новый объект во время выполнения в текущем апартаменте.




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