1

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

4 回答 4

3

该代码之所以有效,是因为 D2010 中引入了一项新功能,即恢复对实现接口的对象的引用的能力。请注意,如果IStream不是由您的 Delphi 代码实现,那么转换将失败。

如果您需要在旧版本的 Delphi 中引用实现对象,那么您将需要使用各种 hack 之一来恢复它。例如:

但是,您不需要回到实现对象。您确实想要这样做的事实非常强烈地表明您的设计是错误的。

于 2013-01-22T19:27:06.293 回答
2

AxCtrls 单元有一个TOleStream对象来做这件事。

var
  aStream: IStream;
  bStream: TStream;
begin
  bStream := TOleStream.Create(aStream);
  try
    //
  finally
    bStream.Free;
  end;
end;
于 2013-01-23T09:56:57.270 回答
0

您需要使用Create类似的方法

var StreamAdapter:TStreamAdapter;
begin
  StreamAdapter := TStreamAdapter.Create(aStream);
...
于 2018-09-28T08:28:40.053 回答
-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;
于 2013-01-23T11:47:12.367 回答