Какой смысл _MERGE_PROXYSTUB?

Я создал объект ATL COM с использованием VS2008, и код содержит ссылки на определение под названием _MERGE_PROXYSTUB (потому что я выбрал параметр "Merge proxy/stub", когда я сначала запускал мастер.)

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

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

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

Ответ 1

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

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

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

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

Таким образом, вы можете обойтись без прокси/заглушек, если приложение, вызывающее объект COM, использует ту же модель потоков, что и ваш объект

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

Ответ 2

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

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

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