2011-12-16 80 views
4

我使用TResourceStream類閱讀資源,知道我要修改內存中的資源,但上面的類的Write方法的文件說:是否可以修改已加載的資源?

應用程序不應該使用TResourceStream來編寫正在運行的應用程序的資源 。當應用程序試圖寫入 應用程序資源時,寫入覆蓋繼承的方法爲 引發EStreamError異常。

由於TResourceStream(WriteBuffer, WriteComponent)的所有其他數據寫入方法調用write做實際的寫作,在調用任何 TResourceStream的數據寫入方法將引發異常。

問題是,有沒有辦法使用任何WinApi函數修改正在運行的應用程序中的資源?還是資源難以讀取?

+0

爲什麼不將資源加載到某個Delphi組件中並在進一步處理之前更改組件內的副本,聽起來要比您必須實現的深WinApi魔法簡單得多。 – Johan 2011-12-17 13:33:50

回答

8

資源只是指向內存映射的一些可執行部分的指針。

因此,您可以使用VirtualProtectEx更改此內存,就像您可以修補任何代碼部分一樣。

關於此技術,請參見Ok to use VirtualProtect to change resource in Delphi?(這裏是關於resourcestring,但是可以在任何鎖定的資源上使用相同的API)。

+1

出於興趣,您是否知道如果您寫入兩個進程之間共享的頁面會發生什麼?據推測操作系統取消它,並在那裏製作副本。 – 2011-12-16 17:38:12

相關問題