Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 是否可以修改已加载的资源?_Delphi_Winapi_Resources - Fatal编程技术网

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

Delphi 是否可以修改已加载的资源?,delphi,winapi,resources,Delphi,Winapi,Resources,我正在使用TResourceStream类来读取资源,我知道我想修改内存中的资源,但是上面类方法的文档说明: 应用程序不应使用TResourceStream来写入资源 正在运行的应用程序的。Write将继承的方法重写为 当应用程序尝试写入时引发EStreamError异常 应用程序的资源 与TResourceStream(WriteBuffer, WriteComponent)调用Write执行实际写入,调用 TResourceStream的数据写入方法将引发异常 问题是,有没有一种方法可以使用

我正在使用
TResourceStream
类来读取资源,我知道我想修改内存中的资源,但是上面类方法的文档说明:

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

与TResourceStream(WriteBuffer, WriteComponent)调用Write执行实际写入,调用 TResourceStream的数据写入方法将引发异常


问题是,有没有一种方法可以使用任何WinApi函数修改正在运行的应用程序中的资源?或者资源是只读的?

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

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


请参阅关于此技术(此处是关于resourcestring,但相同的API可用于任何锁定的资源)。

出于兴趣,您知道如果写入两个进程之间共享的页面会发生什么情况吗?大概是操作系统取消了它的共享,并在那里复制了一份。@David@RobKennedy,操作系统需要PAGE_WRITECOPY标志来完成吗?我不知道,@Free。不过,这似乎是有道理的,不是吗?罗布,的确如此。谢谢为什么不将资源加载到某个Delphi组件中,并在进一步处理之前更改组件内部的副本,这听起来比需要实现的深层WinApi魔术要简单得多。