Нужно ли инициализировать COM (вне процесса) внутри созданного объекта? - PullRequest
0 голосов
/ 10 марта 2012

Я создал службу Windows NT, которая экспортирует интерфейс COM с использованием ATL (COM вне процесса), я выполняю вызовы API CoInitializeEx (0, COINIT_MULTITHREADED) в Ctor (), CoUninitialize () в Dtor ()класса моего объекта?

Чтение Модные дизайнеры приложений сходятся во мнении: модель бесплатной многопоточности - это то, что актуально этой осенью и дают веб-страницам на основе ActiveX поддержку сМодель Threading для квартир ничего не уточнила.

Мой проект ATL имеет декларацию:

#define _ATL_FREE_THREADED

1 Ответ

1 голос
/ 10 марта 2012

Для сервера ATL вне процесса, о котором уже позаботился конструктор CAtlExeModuleT. Он вызовет InitializeCom () в своем конструкторе. Когда вы #defined _ATL_FREE_THREADED, это автоматически произведет вызов CoInitializeEx (NULL, COINIT_MULTITHREADED), как и следовало ожидать. Код легко найти обратно в vc / atlmfc / include / atlbase.h

Вызовы метода интерфейса будут выполняться из заглушки потоком RPC, сам поток, который делает вызов, совершенно непредсказуем. Также довольно опасно, потому что RPC перезапускает потоки, а вызовы часто выполняются одним и тем же потоком. Но не всегда, в зависимости от того, сколько одновременных вызовов обрабатывается. Бремя поддержки свободной многопоточности состоит в том, чтобы гарантировать, что ваш код полностью поточно-ориентирован. Если у вас есть какие-либо ошибки типа тупиковой или многопотоковой гонки или вы полагаетесь на объект синхронизации, который имеет привязку к потокам, например Mutex, по нескольким вызовам, то они не испортят ваш день, пока сервер не будет сильно загружен. Обязательно проверьте это.

...