Delphi Write TResourceStream into TStream



我在 Resorce 文件中嵌入了一个 exe 文件。当我只使用Stream.SaveToFile('test.exe');一切正常,生成的exe文件工作没有错误。但是当我尝试流式传输时,保存到流(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;

TStream是一个抽象类。不得实例化 TStream 的实例。你必须始终实例化一个派生自TStream的具体类,例如TFileStreamTMemoryStreamTStringStream等。

此外,您可以在不初始化的情况下使用MemStream

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

  • 创建资源流。
  • 创建内存流。
  • 调用EnDecryptStream提供资源流作为输入,将内存流作为输出。
  • 调用内存流上的SaveToFile以保存它。

甚至更简单:

  • 创建资源流。
  • 创建文件流。
  • 调用EnDecryptStream提供资源流作为输入,将文件流作为输出。

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

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

我怀疑您尚未启用编译器警告和提示,或者可能忽略了它们。别这样。启用警告和提示,并注意它们。

相关内容

  • 没有找到相关文章

最新更新