Какой смысл _MERGE_PROXYSTUB? - PullRequest
       13

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

11 голосов
/ 18 сентября 2009

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

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

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

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

Ответы [ 2 ]

15 голосов
/ 18 сентября 2009

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

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

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

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

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

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

3 голосов
/ 21 сентября 2009

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

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

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

...