Текущий архив: 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