Форум: "Основная";
Текущий архив: 2003.07.14;
Скачать: [xml.tar.bz2];
ВнизЧто делать с 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c