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

StackOverflow https://stackoverflow.com/questions/852497

Вопрос

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

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

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

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

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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