Что требуется для включения маршалинга для интерфейса COM? - PullRequest
3 голосов
/ 12 мая 2009

У меня есть 32-битный компонент ATL COM без библиотеки типов. У него есть фабрика классов для одного данного класса, которая реализует несколько интерфейсов.

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

Я считаю, что проблема в том, что COM + не может выполнить маршалинг из-за отсутствия библиотеки типов - он понятия не имеет, как это сделать. Нужно ли создавать и регистрировать библиотеку типов для решения этой проблемы или есть какой-либо другой способ?

Ответы [ 3 ]

2 голосов
/ 12 мая 2009

Typelibs - один из способов поддержки маршаллинга, прокси / заглушки DLL (созданные из IDL) - другой. Однако в обоих случаях вам понадобится IDL.

Если Microsoft не предоставляет библиотеки DLL или IDL typelib / proxy для этого интерфейса, вероятно, для этого есть причина: возможно, интерфейс использует немаршализируемые структуры данных, требует, чтобы указатели функций передавались в качестве параметра метода или вещей как это? В этом случае просто невозможно заставить этот интерфейс работать для DCOM.

Может быть, вы сможете восстановить IDL, но вполне возможно, что это просто невозможно. Тогда ваш последний запасной вариант может заключаться в использовании пользовательского или маршаллинга обработчика, но это, вероятно, не стоит этих усилий. Тем не менее, я бы порекомендовал рассмотреть другие маршруты, которые не связаны с использованием интерфейсов для DCOM, которые не были предназначены для использования для DCOM.

1 голос
/ 08 июля 2016

Для COM-интерфейса, который можно маршалировать с помощью маршаллера Microsoft по умолчанию, в интерфейсе должно быть задано свойство DUAL или OLEAUTOMATION, определенное в его заголовке.

Если для определенных методов есть аргументы, которые являются указателями на интерфейс, то эти же требования распространяются и на эти интерфейсы.

Кроме того, имя интерфейса должно присутствовать в разделе LIBRARY IDL, определяя его. Это также распространяется на другие ссылочные интерфейсы.

Если эти условия не будут выполнены, интерфейс не будет маршализуемым.

1 голос
/ 12 мая 2009

Urk. Я бы порекомендовал спросить на microsoft.public.vc.atl , так как, я думаю, вы найдете там больше экспертов. Я думаю (хотя я не эксперт) проблема связана не с COM +, а с проблемой зарегистрированных прокси / заглушек. (Другими словами, даже если вы написали свой собственный COM-клиент для доступа к компоненту вне процесса, вы, вероятно, столкнетесь с той же проблемой). Если у вас есть стандартные интерфейсы, совместимые с Automation, то Windows знает, как просто упорядочить ваши объекты. хорошо. Но в остальном это смущает.

Без библиотеки типов вам нужно либо зарегистрировать прокси / заглушки, либо реализовать IMarshal самостоятельно для обработки пользовательского маршалинга. (или есть еще кое-что «маршалинг обработчика», которого я не понимаю)

Ваш комментарий о том, почему у вас нет библиотеки типов (реализует интерфейс, уже определенный Microsoft, но у которого нет библиотеки типов), поднимает со мной красный флаг. Можете ли вы предоставить более подробную информацию? Если это что-то в .DLL или .EXE, но информация о типе находится внутри самой библиотеки (а не внешнего файла .TLB), вероятно, возможно извлечь нужную информацию, чтобы все работало, я просто не знаком с процесс.

(Кстати, я оставил программирование на ATL / COM в пользу Java, поэтому, хотя я могу сообщить вам, что я помню в прошлом, я не использую инструменты сейчас, и это будет трудно для меня чтобы вернуться в них, чтобы предоставить больше помощи. Но люди на microsoft.public.vc.atl довольно умны.)

...