2016-02-29 85 views
-1

我在Resorce文件中嵌入了一個exe文件。 當我只是使用Stream.SaveToFile('test.exe');一切工作正常,生成的exe文件沒有錯誤的作品。但是當我嘗試Stream.SaveToStream(Stin); ,我收到錯誤「流寫入錯誤」。我的代碼有什麼問題?Delphi將TResourceStream寫入TStream

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; 

編輯:

感謝David ...我改變了我的代碼,它工作得很好:

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; 

回答

3

TStream是一個抽象類。您不得實例化TStream的實例。你必須始終從實例化衍生TStream

具體類,如TFileStreamTMemoryStreamTStringStream等。此外,您使用MemStream沒有初始化它。

看起來你需要做這樣的事情:

  • 創建資源流。
  • 創建一個內存流。
  • 調用EnDecryptStream提供資源流作爲輸入,並將存儲器流作爲輸出提供。
  • 在內存流上調用SaveToFile來保存它。

或者更簡單:

  • 創建資源流。
  • 創建文件流。
  • 調用EnDecryptStream提供資源流作爲輸入,文件流作爲輸出。

我們在Stack Overflow上看到的一種最常見的反模式是內存流的過度使用。你似乎想寫入一個文件,爲什麼不切出內存流,並直接進入文件。

我並不特別想在這裏寫任何代碼,因爲我們在這裏只能看到圖片的一小部分,我寫的任何代碼都可能是錯誤的。

我懷疑你沒有啓用編譯器警告和提示,或者可能忽略它們。不要這樣做。啓用警告和提示,並注意它們。