我在 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
的具体类,例如TFileStream
、TMemoryStream
、TStringStream
等。
此外,您可以在不初始化的情况下使用MemStream
。
看起来你需要做这样的事情:
- 创建资源流。
- 创建内存流。
- 调用
EnDecryptStream
提供资源流作为输入,将内存流作为输出。 - 调用内存流上的
SaveToFile
以保存它。
甚至更简单:
- 创建资源流。
- 创建文件流。
- 调用
EnDecryptStream
提供资源流作为输入,将文件流作为输出。
我们在堆栈溢出上看到的最常见的反模式之一是过度使用内存流。您似乎想要写入文件,那么为什么不切断内存流,然后直接转到文件。
我不是特别想在这里写任何代码,因为我们只能在这里看到图片的一小部分,而且我写的任何代码都可能是错误的。
我怀疑您尚未启用编译器警告和提示,或者可能忽略了它们。别这样。启用警告和提示,并注意它们。