Delphi: why TStreamAdapter is not suitable for IStream-based virtual files?
Hello,
One delphi programmer wrote me that he tried to create a IStream-based virtual file using a TStreamAdapter. But it doesn’t work. Why?
The reason is quite simple: TStreamAdapter doesn’t provide a correct implementation of IStream.Clone. Check Classes.pas:
function TStreamAdapter.Clone(out stm: IStream): HResult; begin Result := E_NOTIMPL; end;
IStream.Clone is important method, BoxedApp SDK uses it. But TStreamAdapter just returns E_NOTIMPL. OK, but what’s the solution?
The solution is to create a new class derived from TStreamAdapter and implement IStream.Clone.
For example, if you need a TStreamAdapter based on TFileStream, the implementation would be the following:
type TCloneSA = class(TStreamAdapter) public Path: String; public function Clone(out stm: IStream): HResult; override; stdcall; destructor Destroy; override; end; { TCloneSA } function TCloneSA.Clone(out stm: IStream): HResult; var FS: TFileStream; S: TCloneSA; begin FS := TFileStream.Create(Path, fmOpenReadWrite or fmShareDenyNone); S := TCloneSA.Create(FS, soOwned); S.Path := Path; result := S.QueryInterface(IStream, stm); end;
Recent Comments