是否可以修改已加载的资源?

4
我正在使用TResourceStream类来读取资源,现在我想在内存中修改这个资源,但是上述类的Write方法的文档说:

应用程序不应使用TResourceStream来写入运行应用程序的资源。Write重写继承的方法,当应用程序尝试写入应用程序的资源时,会引发EStreamError异常。

由于TResourceStream的所有其他数据写入方法(WriteBuffer、WriteComponent)都调用Write进行实际写入,因此调用任何TResourceStream的数据写入方法都会引发异常。

问题是,是否有一种方法可以使用任何WinApi函数修改我正在运行的应用程序中的资源?还是资源严格为只读?

为什么不将资源加载到某个 Delphi 组件中,在进一步处理之前更改组件内的副本,听起来比你必须执行的深层 WinApi 魔法要简单得多。 - Johan
1个回答

8

资源只是指向内存中某个可执行部分的指针。

因此,您可以使用VirtualProtectEx更改此内存,就像您可以修补代码的任何部分一样。

有关此技术的详细信息,请参见在Delphi中更改资源使用VirtualProtect是否可行?(这里是关于resourcestring,但是同样的API可以用于任何已锁定的资源)。


1
你知道如果你写入一个被两个进程共享的页面会发生什么吗?大概操作系统会取消共享并且复制一份。 - David Heffernan
这正是发生的事情,@David。 - Rob Kennedy
@RobKennedy,操作系统需要PAGE_WRITECOPY标志来执行此操作吗? - Free Consulting
我不知道,@Free。虽然这似乎是有道理的,不是吗? - Rob Kennedy
@Rob,确实。谢谢! - Free Consulting

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接