Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как в MIDL унаследовать интерфес?  (Прочитано 11119 раз)
0 Пользователей и 1 Гость смотрят эту тему.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« : 14-01-2005 07:18 » 

Как в MIDL унаследовать интерфес?
Вот файл  MIDL:
Код:
import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(062411C6-16D9-489D-BCE3-44E8D8542680),
dual,
helpstring("ITPC_Ed_Dlg Interface"),
pointer_default(unique)
]
interface ITPC_Ed_Dlg : IDispatch
{
[id(1), helpstring("method Run")] HRESULT Run(BSTR Sql, LPDISPATCH Con, BSTR AcseptSql, BSTR DeclineSql, BSTR Script,VARIANT Parent);
};

[
uuid(9915D73F-2705-4A24-8A9D-F813C8ED6636),
version(1.0),
helpstring("PSD_TPC 1.0 Type Library")
]
library PSD_TPCLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");

[
uuid(9F4F78FC-C696-48A6-A5B4-862C2C663DE9),
helpstring("_ITPC_Ed_DlgEvents Interface")
]
dispinterface _ITPC_Ed_DlgEvents
{
properties:
methods:
};
[
object,
uuid(36282133-BA4F-44A1-BA37-6AD6B7FBD12E),
dual,
helpstring("ITPC_Ed Interface"),
pointer_default(unique)
]
interface ITPC_Ed : IDispatch
{
};

[
uuid(0E92CB9B-2857-4D3F-803D-055EEFC7D57F),
helpstring("TPC_Ed_Dlg Class")
]
coclass TPC_Ed_Dlg
{
[default] interface ITPC_Ed_Dlg;
[default, source] dispinterface _ITPC_Ed_DlgEvents;
};
[
uuid(0059B9D0-4222-402F-BC6F-5CC4ACE5896A),
helpstring("_ITPC_EdEvents Interface")
]
dispinterface _ITPC_EdEvents
{
properties:
methods:
};
[
object,
uuid(A6009333-D704-4DF8-9900-1F9FADCFB023),
dual,
helpstring("IFuelEd Interface"),
pointer_default(unique)
]
// Этот интерфес мне нужно унаследовать от ITPC_Ed_Dlg  как это оформить ?

interface IFuelEd :IDispatch
{
};

[
uuid(586AE268-7786-43D8-A72D-51867902A2E2),
helpstring("TPC_Ed Class")
]
coclass TPC_Ed
{
[default] interface ITPC_Ed;
[default, source] dispinterface _ITPC_EdEvents;
};
[
uuid(005F2E13-3E2B-4F91-9A82-42E832173F9F),
helpstring("FuelEd Class")
]
coclass Fuel_Ed_Dlg
{
[default] interface IFuelEd;
};
};

Интерфес interface IFuelEd  мне нужно унаследовать от ITPC_Ed_Dlg  как это оформить ?
Что то у меня при любых вариантах бьет ошибку.

Записан

Да да нет нет все остальное от лукавого.
blind rain
Гость
« Ответ #1 : 17-01-2005 05:20 » 

Если мне память не изменяет, MIDL не поддерживает множественного наследования интерфейсов.
Заменил в Вашем коде
Код:
 interface IFuelEd :ITPC_Ed_Dlg 

Результат: PSD.tlb - 0 error(s), 0 warning(s)

Какие хоть сообщения пишуться?

P.S. Если планируется использовать библиотеку типов для написания реализации компонент на других языках, возможна ситуация, когда эти языки не смогут корректно сгенерировать обертку при косвенном наследовании от IDispatch. (VB6 - по-моему страдает этим недостатком)
В этом случае дополнительно можно воспользоваться
Код:
 
      [
           uuid(586AE268-7786-43D8-A72D-51867902A2EE),
           helpstring("IFuelEd Dispatch wrapper")
     ]   
    dispinterface IDispFuelEd
    {
        interface IFuelEd;
    };
Записан
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 17-01-2005 06:37 » new

У меня была такая идея у меня есть несколько типов компонент, у каждой компоненты  есть общая часть (базовый интерфес) и специальная часть ... по аналогии с С++ я хотел создать базовый интерфес и просто унаследовать от него все остальные ... но почитал Э. Этрельсен "Модель СОМ и применение ATL 3.0" там аналогичная задача решалась созданием 2х интерфесов к одному компоненту... и говорилось что это более правеное решение....почему?  я еще не разобрался, но так пишут.

С транно сечас заменил
interface IFuelEd:ITPC_Ed_Dlg //:IDispatch
и все скомпелировалось.... до этого в шаблоне CreateInstanse ругались на чисто виртуальные методы... наверно это было связано стем что я унаследовал интерфест но не определил методы в новом объекте......
Мля оказывается этот путь не самый короткий......
« Последнее редактирование: 17-01-2005 06:43 от PSD » Записан

Да да нет нет все остальное от лукавого.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines