如何在Delphi 7上将IStream转换为TStreamAdapter?
在Delphi XE2上我可以写:
var
aStream: IStream;
aStreamAdapter: TStreamAdapter;
begin
...
aStreamAdapter := aStream as TStreamAdapter;
...
end;
但德尔福7写道:
Error: Operator not applicable to this operand type
答案 0 :(得分:3)
该代码的工作原理是由于D2010中引入了一项新功能,即能够恢复对实现接口的对象的引用。请注意,如果IStream
是由除Delphi代码之外的其他内容实现的,则转换将失败。
如果您需要在旧版本的Delphi中引用实现对象,那么您将需要使用其中一种黑客来恢复它。例如:
但是,您不需要返回实现对象。您确实希望这一事实非常强烈地表明您的设计是错误的。
答案 1 :(得分:0)
单位AxCtrls有一个TOleStream对象可以做到这一点。
var
aStream: IStream;
bStream: TStream;
begin
bStream := TOleStream.Create(aStream);
try
//
finally
bStream.Free;
end;
end;
答案 2 :(得分:0)
您需要使用Create
这样的方法
var StreamAdapter:TStreamAdapter;
begin
StreamAdapter := TStreamAdapter.Create(aStream);
...
答案 3 :(得分:-1)
示例代码:
var
aFileStream: TFileStream;
iStr: TStreamAdapter;
iRes , iRes1, iRes2: Largeint;
aStreamStat: TStatStg;
aStreamContent: IStream;
begin
aFileStream := TFileStream.Create('<...>', fmCreate);
try
aStreamContent := <...> as IStream;
aStreamContent.Seek(0, 0, iRes);
iStr := TStreamAdapter.Create(aFileStream, soReference);
aStreamContent.Stat(aStreamStat, 1);
aStreamContent.CopyTo(iStr, aStreamStat.cbSize , iRes1, iRes2);
finally
aFileStream.Free;
end;
end;