Delphi将TResourceStream写入TStream

时间:2016-02-29 19:24:24

标签: delphi stream

我在Resorce文件中嵌入了一个exe文件。 当我只使用Stream.SaveToFile('test.exe');一切正常,生成的exe文件工作没有错误。但是当我尝试Stream.SaveToStream(Stin); ,我收到错误“流写错误”。我的代码出了什么问题?

var
list: TStringList;
Stream: TResourceStream;
Stin, Stout: TStream;
MemStream: TMemoryStream;
begin
Stream := TResourceStream.Create(HInstance, 'phprogram' , RT_RCDATA);
try

  Stin := TStream.Create;
  Stout := TStream.Create;
  Stream.Position := 0;
  Stream.SaveToStream(Stin);
  EnDecryptStream(Stin, Stout, 2913);
  MemStream.LoadFromStream(Stout);
  MemStream.SaveToFile('test.exe');
  //Stream.SaveToFile('test.exe');

 finally
  Stream.Free;
end;
end;

已编辑:

感谢大卫...我改变了我的代码并且工作正常:

var

  Stream: TResourceStream;
 MemStream: TMemoryStream;
 begin
   Stream := TResourceStream.Create(HInstance, 'testres' , RT_RCDATA);
   MemStream := TMemoryStream.Create;
    try

     EnDecryptStream(Stream, MemStream, 2913);
     MemStream.SaveToFile('test.exe');

   finally
   MemStream.Free;
  Stream.Free;
end;
end;

1 个答案:

答案 0 :(得分:3)

TStream是一个抽象类。您不能实例化TStream的实例。您必须始终实例化从TFileStream派生的具体类,例如TMemoryStreamTStringStreamMemStream等。

此外,您在不初始化的情况下使用EnDecryptStream

看起来你需要做这样的事情:

  • 创建资源流。
  • 创建内存流。
  • 调用SaveToFile,将资源流作为输入,将内存流作为输出。
  • 在内存流上调用EnDecryptStream进行保存。

甚至更简单:

  • 创建资源流。
  • 创建文件流。
  • 调用{{1}},将资源流作为输入,将文件流作为输出。

我们在Stack Overflow上看到的最常见的反模式之一是过度使用内存流。您似乎想要写入文件,为什么不切断内存流,直接转到该文件。

我并不特别想在这里编写任何代码,因为我们只能看到这里的一小部分代码,而我写的任何代码都可能是错误的。

我怀疑你没有启用编译器警告和提示,或者可能忽略它们。不要这样做。启用警告和提示,并注意它们。