Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top