Вопрос

Я создаю COM-объект с использованием Visual Studio 2008 и ATL. Добавить простые свойства и методы достаточно просто, но теперь я хочу сделать что-то более сложное. Я хочу предоставить доступ к объекту C ++ через свойство моего COM-объекта, чтобы я мог сделать что-то вроде:

// Pseudo-code
var obj = CreateObject("progid");
obj.aProperty.anotherProperty = someValue;

Итак, aProperty возвращает ссылку на другой объект, который предоставляет свойство с именем anotherProperty.

Я предполагаю, что мне нужно добавить еще один простой объект ATL в свой проект для второго объекта (назовите его IClass2) и добавить что-то вроде следующего в IDL:

[propget, id(1)] HRESULT aProperty([out, retval] IClass2** ppValue);

Я на правильном пути? Кто-нибудь знает хороший учебник для такого рода вещей?

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

Решение 2

Я только что наткнулся на эту статью:

HOWTO: реализовать иерархию статических объектов в ATL

Это выглядит очень похоже на то, чего я пытаюсь достичь.

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

Если вы собираетесь вызывать его из языка автоматизации, вам потребуется интерфейс, возвращаемый из IDispatch, и вам, вероятно, придется возвращать его хотя бы в виде IDispatch **. Для ретваля я думаю, что этого достаточно; для простых [out] параметров вам нужно передать его как VARIANT * (с типом варианта, установленным в VT_LPDISPATCH), чтобы язык автоматизации мог его понять.

Я не уверен, что есть хороший учебник; Прошло много времени с тех пор, как я искал исчерпывающую ссылку. Лучший совет, который я мог бы дать, это убедиться, что все, что вы передаете, совместимо с автоматизацией (например, это тип, который вы можете поместить в VARIANT), и это должно решить 80% ваших проблем. Это очень выполнимо, хотя; просто прочитайте на MSDN, и все будет в порядке.

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