Связь между объектами COM
От: Hawk Россия  
Дата: 08.11.02 06:19
Оценка:
Есть два объекта, которые должны ссылаться друг на друга. Их интерфейсы описываются так (с помощью атрибутов в VS.NET):

Foo.h

// IFoo

[
    object,
    uuid("3301B939-CA8B-4267-BDA5-9A9889EA98E6"),
    dual,    helpstring("IFoo Interface"),
    pointer_default(unique)
]
__interface IFoo : IDispatch
{
    [id(1), helpstring("method SetBar")] HRESULT SetBar([in] IBar* pBar);
    [id(2), helpstring("method GetBar")] HRESULT GetBar([out,retval] IBar** pBar);
};
...


Bar.h

// IBar

[
    object,
    uuid("947522B2-FA94-4173-A834-3CF41FB2C47E"),
    dual,    helpstring("IBar Interface"),
    pointer_default(unique)
]
__interface IBar : IDispatch
{
    [id(1), helpstring("method SetFoo")] HRESULT SetFoo([in] IFoo* pFoo);
    [id(2), helpstring("method GetFoo")] HRESULT GetFoo([out,retval] IFoo** pFoo);
};
...


Данные кострукции затем преобразуются (автоматически) в IDL-файл:

_Module.idl

[
    object,
    uuid("947522B2-FA94-4173-A834-3CF41FB2C47E"),
    dual,
    helpstring("IBar Interface"),
    pointer_default(unique)
] 
...
interface IBar : IDispatch {
...
    [id(1), helpstring("method SetFoo")] HRESULT SetFoo([in] IFoo* pFoo);
    [id(2), helpstring("method GetFoo")] HRESULT GetFoo([out,retval] IFoo** pFoo);
};

[
    object,
    uuid("3301B939-CA8B-4267-BDA5-9A9889EA98E6"),
    dual,    helpstring("IFoo Interface"),
    pointer_default(unique)
]
__interface IFoo : IDispatch
{
    [id(1), helpstring("method SetBar")] HRESULT SetBar([in] IBar* pBar);
    [id(2), helpstring("method GetBar")] HRESULT GetBar([out,retval] IBar** pBar);
};


При компиляции компилятор, естественно, ругается, т.к. не может найти IFoo при компиляции IBar. Первый вопрос: Как быть? Второй вопрос: Есть ли другие (быть может более эффективные и/или универсальные) способы связи объектов в COM?
Re: Связь между объектами COM
От: Алекс Россия http://wise-orm.com
Дата: 08.11.02 09:46
Оценка:
Здравствуйте Hawk, Вы писали:

H>Есть два объекта, которые должны ссылаться друг на друга. Их интерфейсы описываются так (с помощью атрибутов в VS.NET):


[]

H>При компиляции компилятор, естественно, ругается, т.к. не может найти IFoo при компиляции IBar. Первый вопрос: Как быть?


Не знаю как в .Net, но в обычном idl это разрешается путем forward описания.

interface IMyInterface1;

[...]
interface IMyInterface2 : IUnknown
{
//Используем IMyInterface1
}

[...]
interface IMyInterface1 : IUnknown
{
//Используем IMyInterface2
}


H>Второй вопрос: Есть ли другие (быть может более эффективные и/или универсальные) способы связи объектов в COM?


Связь — понятие очень растяжимое.
Re: Связь между объектами COM
От: warhast Россия  
Дата: 09.11.02 14:54
Оценка:
Здравствуйте Hawk, Вы писали:

H>Есть два объекта, которые должны ссылаться друг на друга. Их интерфейсы описываются так (с помощью атрибутов в VS.NET):

..................

H>Данные кострукции затем преобразуются (автоматически) в IDL-файл:

....................

А перед ними строчки [idl_quote("interface IFoo;interface IBar;")]; едва ли что проще можно сделать тут
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.