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

Вниз

Объявлен ли IStream в какой-нибудь библиотеке типов?   Найти похожие ветки 

 
Asdor ©   (2004-03-18 11:22) [0]

Надо передаветь IStream в качестве параметра метода интерфейса ком-объекта... Интерфейс описан в библиотеке типов, и поэтому параметры его методов должны быть совместимы с OLE Automation- типами. IUnknown передавать не хочу, потому как неудобно...


 
Digitman ©   (2004-03-18 11:27) [1]

uses ActiveX


 
Asdor ©   (2004-03-18 11:29) [2]

Не... ActiveX это конечно хорошо и это я знаю... :)
Мне нужна именно библиотека типов...


 
Asdor ©   (2004-03-18 11:31) [3]

Может я неправильно написал условие... Я в библиотеке типов, при создании интерфейса не могу указать, что у меня у метода интерфейса параметр типа IStream.


 
Digitman ©   (2004-03-18 11:45) [4]

а ты не имеешь права этого делать в случае если разрабатываешь библ-ку типов, предназначенную к использованию стандартным OLE-механизмом, а не только для внутреннего использования

ты вправе указать либо IUnknown либо IDispatch
тело твоего интерфейсного метода, получив IUnknown-параметр, делает попытку запроса интерфейса IStream у интерф.объекта, переданного тебе как IUnknown-параметр ... в случае успешного преобразования ты продолжаешь работу с объектом, приведенном к IStream, в противном случае возбуждаешь исключение


 
Asdor ©   (2004-03-18 11:54) [5]

Да. Ты прав. Спасибо.


 
Digitman ©   (2004-03-18 12:09) [6]

вот некий работающий пример, как некий контроллер автоматизации использует IStream-объект, ссылку на который получает как Inknown


function TfrmDemoMain.GetJobNote(const Job: IAuftrag): String;
var
 NoteSize: Integer;
 NoteStream: IStream;
 NoteStreamState:  STATSTG;
begin
//Job и AuftragNotes - некие агрегатные объекты в составе сервера автоматизации

//раннее связывание

 NoteStream := Job.AuftragNotes[""].Item[0].NoteStream as IStream; //NoteStream - некое св-во типа IUnknown, которое пытаемся преобразовать к IStream, запрашивая у NoteStream данный интерфейс

//преобразование к IStream прошло успешно
//обращаемся к станд.методам IStream
 NoteStream.Stat(NoteStreamState, STATFLAG_DEFAULT);
 NoteStream.Read(@NoteSize, SizeOf(NoteSize), nil);
 SetLength(Result, NoteStreamState.cbSize - SizeOf(NoteSize));
 NoteStream.Read(PChar(Result), Length(Result), nil);
 Result := PWideChar(Result);
end;


 
Asdor ©   (2004-03-18 12:14) [7]

Спасибо, еще раз... :)
Но я знаю, как это делается...
Меня интересовал именно вопрос заданный в теме сообщения... причем я подозревал, что ответ на него будет отрицательный, т.к. IStream - достаточно низкоуровневый интерфейс, и задал его просто на всякий случай... :)


 
Замороченный   (2004-03-18 16:46) [8]

TStreamAdapter и TOleStream


 
Digitman ©   (2004-03-18 16:55) [9]


> Замороченный


??


 
Замороченный   (2004-03-18 17:18) [10]

TStreamAdapter обертка вокруг TStream к IStream
TOleStream обертка вокруг IStream к TStream


 
Digitman ©   (2004-03-18 17:46) [11]


> Замороченный


ты вообще-то понял, что автор творит TypeLib, которкая будет использоваться стандартными олей-контроллерами, использующими стандартный олей-механизм для доступа к стандартным олей-серверам ?


 
Замороченный   (2004-03-18 19:21) [12]

Вот блин сложность.
Берешь в Toolls\Environment Option\Type Library
Ставишь Language Pascal
И в библиотеке типов где tlb на закладке Text, предварительно убрав значек ReadOnly

 IStream = interface(ISequentialStream)
   ["{0000000C-0000-0000-C000-000000000046}"]
   function Seek(dlibMove: Largeint; dwOrigin: Longint;
     out libNewPosition: Largeint): HResult; stdcall;
   function SetSize(libNewSize: Largeint): HResult; stdcall;
   function CopyTo(stm: IStream; cb: Largeint; out cbRead: Largeint;
     out cbWritten: Largeint): HResult; stdcall;
   function Commit(grfCommitFlags: Longint): HResult; stdcall;
   function Revert: HResult; stdcall;
   function LockRegion(libOffset: Largeint; cb: Largeint;
     dwLockType: Longint): HResult; stdcall;
   function UnlockRegion(libOffset: Largeint; cb: Largeint;
     dwLockType: Longint): HResult; stdcall;
   function Stat(out statstg: TStatStg; grfStatFlag: Longint): HResult;
     stdcall;
   function Clone(out stm: IStream): HResult; stdcall;
 end;

И о чудо у тебя есть Istream


 
nikkie ©   (2004-03-18 20:10) [13]

>Интерфейс описан в библиотеке типов, и поэтому параметры его методов должны быть совместимы с OLE Automation- типами.

логика лично мне непонятна, но если есть требование совместимости с OLE Automation, то IStream, равно как и любой иной интерфейс кроме IUnknown и IDispatch, использовать нельзя.


 
Замороченный   (2004-03-18 20:31) [14]

Вернее, что было красиво
IStream = interface(ISequentialStream)
[uuid "{0000000C-0000-0000-C000-000000000046}"]
 function Seek(dlibMove: Largeint; dwOrigin: Longint;
   out libNewPosition: Largeint): HResult; stdcall;
 function SetSize(libNewSize: Largeint): HResult; stdcall;
 function CopyTo(stm: IStream; cb: Largeint; out cbRead: Largeint;
   out cbWritten: Largeint): HResult; stdcall;
 function Commit(grfCommitFlags: Longint): HResult; stdcall;
 function Revert: HResult; stdcall;
 function LockRegion(libOffset: Largeint; cb: Largeint;
   dwLockType: Longint): HResult; stdcall;
 function UnlockRegion(libOffset: Largeint; cb: Largeint;
   dwLockType: Longint): HResult; stdcall;
 function Stat(out statstg: TStatStg; grfStatFlag: Longint): HResult;
   stdcall;
 function Clone(out stm: IStream): HResult; stdcall;
end;

и соответственно описание для
ISequentialStream


 
Asdor ©   (2004-03-19 10:41) [15]

Это конечно все хорошо... но не проще ли в таком случае QueryInterface сделать?
И еще... Если мы объявим свой IStream, то он при регистрации библиотеки типов в реестре перетрет \HKEY_CLASSES_ROOT\Interface\{0000000c-0000-0000-C000-000000000046}\ProxyStubClsid32
и запишет туда OLEAutomation ProxyStub, и, скорее всего, из-за этого все ком-объекты системы, использующие IStream  перестанут нормально работать. Честно говоря, желания так эксперементировать нету... :)



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

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

Наверх




Память: 0.51 MB
Время: 0.021 c
1-1079180964
Oyster
2004-03-13 15:29
2004.04.04
Как забить весь экран?


6-1075054663
MadGhost
2004-01-25 21:17
2004.04.04
что значат флаги в TCP? ?????


1-1079010134
ламер2
2004-03-11 16:02
2004.04.04
Регистрация нового компонента в Delphi5


1-1077897634
Andrew
2004-02-27 19:00
2004.04.04
Сертификаты открытого ключа


6-1074683336
Winnet
2004-01-21 14:08
2004.04.04
Где найти документацию по TcpClient и TcpServer