我在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;
答案 0 :(得分:3)
TStream
是一个抽象类。您不能实例化TStream
的实例。您必须始终实例化从TFileStream
派生的具体类,例如TMemoryStream
,TStringStream
,MemStream
等。
此外,您在不初始化的情况下使用EnDecryptStream
。
看起来你需要做这样的事情:
SaveToFile
,将资源流作为输入,将内存流作为输出。EnDecryptStream
进行保存。甚至更简单:
我们在Stack Overflow上看到的最常见的反模式之一是过度使用内存流。您似乎想要写入文件,为什么不切断内存流,直接转到该文件。
我并不特别想在这里编写任何代码,因为我们只能看到这里的一小部分代码,而我写的任何代码都可能是错误的。
我怀疑你没有启用编译器警告和提示,或者可能忽略它们。不要这样做。启用警告和提示,并注意它们。