Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка при наследовании интерфейса 
V
    Опции темы
RastaDja
Дата 8.2.2011, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



Доброго времени суток!
Вот столкнулся с проблемой, которую не знаю как решить.

Есть у меня в одной библиотеке два ActiveX. Оба имеют разные интерфейсы.

Интерфейс первого таков (например)
Код

interface IDrow : IDispatch
    {
        [propget, id(1), helpstring("property Len")] HRESULT Len([out, retval] long *len);        //+
        [id(2), helpstring("method ReDraw")] HRESULT ReDraw();                                        
    };


Интерфейс второго:
Код

nterface IDrow2 : IDispatch
    {
        [propget, id(1), helpstring("property Len")] HRESULT Len([out, retval] long *len);        //+
        [id(2), helpstring("method ReDraw")] HRESULT ReDraw();    
        [id(3), helpstring("method Set pos")] HRESULT setPos(long pos);                        
    };


так как у них есть идентичные методы решил IDrow2 унаследовать от IDrow:
Код

nterface IDrow2 : IDrow
    {
        [id(3), helpstring("method Set pos")] HRESULT setPos(long pos);                        
    };

как можете заметить id = 3. Когда я пытаюсь сделать id = 1, получаю ошибку

midl\oleaut32.dll : error MIDL2020 : error generating type library : LayOut failed : ISpView2

Вопрос:  как правильно унаследовать интерфейс, чтоб id нумерировать начиная с 1
PM MAIL   Вверх
xvr
Дата 8.2.2011, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(RastaDja @  8.2.2011,  12:06 Найти цитируемый пост)
Вопрос:  как правильно унаследовать интерфейс, чтоб id нумерировать начиная с 1 
Правильно - никак. ID 1 (и 2 тоже) у вас уже есть - они использованны в базовом интерфейсе IDrow

PM MAIL   Вверх
RastaDja
Дата 8.2.2011, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



Цитата(xvr @  8.2.2011,  12:51 Найти цитируемый пост)
Правильно - никак. ID 1 (и 2 тоже) у вас уже есть - они использованны в базовом интерфейсе IDrow

то есть 
Код

nterface IDrow2 : IDrow
    {
        [id(3), helpstring("method Set pos")] HRESULT setPos(long pos);                        
    };

это так должно быть, и это правильно?


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
xvr
Дата 8.2.2011, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Да. Все ID (включая и те, что в базовом интерфейсе) должны быть уникальными


PM MAIL   Вверх
RastaDja
Дата 8.2.2011, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



тогда спасибо, вопросов больше нет!

Добавлено через 5 минут и 10 секунд
ОЙ. Поспешил с закрытием темы. Ещё 1 вопрос.

Почему тогда при наследовании от IDispatch или IUnknown id начинаются с 0 а не с 6 или 4 соответственно?


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
xvr
Дата 8.2.2011, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(RastaDja @  8.2.2011,  13:24 Найти цитируемый пост)
Почему тогда при наследовании от IDispatch или IUnknown id начинаются с 0 а не с 6 или 4 соответственно?

Методы самого IDispatch (или IUnknown) не могут быть вызваны через интерфейс диспетчеризации (IDispatch::Invoke). А ID собственно для него (IDispatch::Invoke) и сделаны.

Добавлено через 1 минуту и 53 секунды
Если вы посмотрите на С++ хидер после midl, то в интерфейсе disp (но не dual!) вы своих описанных методов вообще не найдете  smile 

PM MAIL   Вверх
RastaDja
Дата 8.2.2011, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



тоесть 
Код

nterface IDrow2 : IDispatch
    {
        [propget, id(1), helpstring("property Len")] HRESULT Len([out, retval] long *len);        //+
        [id(2), helpstring("method ReDraw")] HRESULT ReDraw();    
        [id(3), helpstring("method Set pos")] HRESULT setPos(long pos);                        
    };

и
Код

nterface IDrow2 : IDrow
    {
        [id(3), helpstring("method Set pos")] HRESULT setPos(long pos);                        
    };


по сути одно и тоже, и не нисёт никакой информации о том что IDrow2 унаследован от IDrow?

Добавлено через 43 секунды
тоесть 
Код

nterface IDrow2 : IDispatch
    {
        [propget, id(1), helpstring("property Len")] HRESULT Len([out, retval] long *len);        //+
        [id(2), helpstring("method ReDraw")] HRESULT ReDraw();    
        [id(3), helpstring("method Set pos")] HRESULT setPos(long pos);                        
    };

и
Код

nterface IDrow2 : IDrow
    {
        [id(3), helpstring("method Set pos")] HRESULT setPos(long pos);                        
    };


по сути одно и тоже, и не нисёт никакой информации о том что IDrow2 унаследован от IDrow?


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
xvr
Дата 8.2.2011, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Не совсем одно и тоже - в 2м случае QueryInterface от IDrow2 на UUID_IDrow вернет IDraw (по сути IDispatch), а в 1м случае не вернет.
А по набору методов (Native) они одинаковы

PM MAIL   Вверх
RastaDja
Дата 9.2.2011, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



Ну вот и все. Думаю разобрался.

спс


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.1093 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.