Вопрос
Я создаю 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, и все будет в порядке.