2009-09-18 5 views
10

Я создал объект ATL COM с помощью VS2008 и код содержит ссылки на определение называется _MERGE_PROXYSTUB (потому что я выбрал опцию «Merge прокси/заглушки», когда я сначала запускали мастер.)В чем смысл _MERGE_PROXYSTUB?

Что такое точка прокси/заглушка? Если я не выберу вариант слияния, вместо этого я получу отдельный MyControlPS.DLL - когда это когда-нибудь будет использоваться?

FWIW контроль, кажется, регистрируется и работает нормально, если я удалю весь код, окруженный _MERGE_PROXYSTUB. Отладочная сборка даже не определяет _MERGE_PROXYSTUB, и она все еще работает нормально.

Итак, могу ли я сделать без прокси/заглушки?

ответ

14

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

Например, у нас есть подключаемый модуль, который загружается приложением, которое использует определенную модель потоков (не помню, какой), но наш COM-объект представляет собой многопоточную квартиру (MTA) - поэтому прокси-сервер требуется для сортировки данных между объектами при вызове функции, при этом все еще придерживаясь правил модели потоковой передачи.

Если эти правила нарушаются, то COM либо выбросить исключение или вернуть отказ HRESULT такой, как RPC_E_WRONG_THREAD

Если вы не отметите опцию слияния прокси/стаб, то Visual Studio производит индивидуальный проект для прокси/заглушки, которые встраиваются в отдельную dll. Это затрудняет развертывание приложений, если они необходимы, но вы можете просто игнорировать их, если на них не влияют проблемы с потоковой моделью.

Таким образом, вы можете обойтись без прокси/окурков, если приложение вызова СОМ-объекта использует ту же потоковую модель в качестве объекта

Ларри Остерман обеспечивает читаемое введение в threading models на своем блоге.

3

Кроме того, если ваши интерфейсы содержат только типы, совместимые с типами (BSTR, VARIANT и т. Д.) И отображаться в блоке библиотеки вашего IDL, вы можете выбрать, чтобы они «сортировали библиотеку типов», что означает, если proxy/stub использует метаданные из библиотеки типов.

Когда интерфейсы помещаются внутри блока библиотеки, а DllRegisterServer настроен для регистрации библиотеки типов (передайте TRUE в XxxModule :: DllRegisterServer, если я правильно помню), ваши интерфейсы будут распределяться по системе, если необходимо, как описано Джон Сибли.

В этот момент прокси/заглушка даже не используется, поэтому _MERGE_PROXYSTUB не действует.