Вопрос
Я сгенерировал 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
не действует.