如何将IStream转换为TStreamAdapter?

时间:2013-01-22 19:21:45

标签: delphi com interface delphi-7 istream

如何在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

4 个答案:

答案 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;