Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.14;
Скачать: CL | DM;

Вниз

Что делать с IInterface ( = IUnknown ) ?   Найти похожие ветки 

 
avkiev   (2003-07-01 22:20) [0]

Уважаемые, приветствую.
Есть у меня такая функция:

function TDMP.GetFile(const path: WideString): IUnknown;
begin
Result := DefaultInterface.GetFile(path);
end;

Результат ее выполнения я присвоил переменной. Вопрос такой: как имея эту переменную доступиться к содержимому запрашиваемого файла ? Или, иными словами, что делать с этой переменной ? Как работать с переменными типа IInterface ( =IUnknown ) ?
ЗЫ. Описания на функцию GetFile не имеется :(
Заранее премного благодарен


 
Тих   (2003-07-01 22:54) [1]

IUnknown - это навроде типа Pointer, который ты можешь опросить - поддерживает ли он приведение к какому-либо классу(это в терминах Delphi) при помощи функции IUnknown QueryInterface. Т.е. в твоем случае известно, что экземпляром класса возвращается интерфейсный указатель на IUnknown. Допустим, что разработчик этого класса посчитал, что загруженный с диска файл может быть представлен и как поток байт, IStream, и как массив байт, IArray. Выяснить, поддерживает ли класс эти интерфесы, можно примерно так.

var pUnk: IUnknown;
pArr: IArray;
pStream: IStream;
pDevice: IDevice;
begin
pUnk := nil; pArr := nil; pStream := nil; pDevice := nil;

pUnk := pDmp.GetFile("C:\command.com");
pUnk.QueryInterface(IArray, pArr);
// если pArr <> nil - интерфейс IArray поддерживается
pUnk.QueryInteface(IStream, pStream);
// аналогично
pUnk.QueryInteface(IDevice, pDevice);
// интерфейс классом заведомо не выставляется, всегда будет Nil

Голый IUnknown бесполезен. Нужно знать о всех интерфейсах и их методах, выставляемых коклассом - из документации, кода или Type Library COM-сервера.


 
avkiev   (2003-07-01 23:26) [2]

Э... А что такое IArray ? Где он описан ?


 
Тих   (2003-07-01 23:36) [3]

Пример абстрактный, я же не знаю, какие интерфейсы выставляет ваш класс.
IArray и IDevice - это мой полет фантазии.
IStream - стандартный интерфейс, в MSDN описан.

Раз уж вы залезли в COM - могу настоятельно порекомендовть: Э.Трельсен, "Модель COM и ATL 3.0"


 
Skier ©   (2003-07-02 09:16) [4]


> Как работать с переменными типа IInterface ( =IUnknown )
> ?
> ЗЫ. Описания на функцию GetFile не имеется :(

Кастить на интерфейс где GetFile имеется.


 
avkiev   (2003-07-02 11:24) [5]

> Кастить на интерфейс где GetFile имеется
Это как ? Можно поподробнее ?


 
clickmaker ©   (2003-07-02 11:37) [6]

(Unk as IInterfaceHavingGetFile).GetFile

либо

var Intf: IInterfaceHavingGetFiles;

OleCheck(Unk.QueryInterface(IID_IInterfaceHavingGetFile, Intf));
Intf.GetFile;


 
avkiev   (2003-07-02 15:42) [7]

Извините, не понимаю. Откуда взялся тип IInterfaceHavingGetFiles ?
Что неправильно в этом коде ?
const CLASS_TDMP: TGUID = "{D73D7EA8-AD8A-11D3-A271-00105A3B325A}";
var mob: TDMP;
ii: IInterface;
arr: array [1..1000] of IStream;
parr: ^IStream;
f: IStream;
...
parr:=@arr;
ii:=nil;
ii:=mob.GetFile(from); //После этого оператора ii равен какому-то указателю
f:=IStream(ii.QueryInterface(CLASS_TDMP, parr));

И тут вылетает ошибка:
... raised too many consecutive exceptions: "access violation at 0x00c86042: read of address 0x80004002".
А эта книга (Э.Трельсен, "Модель COM и ATL 3.0") существует в электронном виде ?


 
Serginio   (2003-07-02 15:54) [8]

Да уж наверное интересная книга если учесть что QueryInterface возвращает HResult (Integer). Если хочешь получить указатель то во всяком случае применяй такой подход
F:=II as IStream; который аналогичен OleCheck(ii.QueryInterface(IStream, f));



 
avkiev   (2003-07-02 16:14) [9]

Всем большое спасибо, а Serginio - огромное !
Ответом на мой вопрос явилась строчка F:=II as IStream;
Удачи



Страницы: 1 вся ветка

Текущий архив: 2003.07.14;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
1-44758
Zigs
2003-07-01 15:41
2003.07.14
Как изменить в QReport положение TQRDBTEXT на лету?


6-44781
Antipich
2003-05-07 18:46
2003.07.14
Папка в инете


14-44813
delphimun
2003-06-25 20:26
2003.07.14
Компонент для создания архивов и извлечения файлов из них


3-44579
www
2003-06-20 15:09
2003.07.14
Переиндексация


3-44611
Igorexa
2003-06-21 05:31
2003.07.14
Навигация в ADO