C++中如何直接访问已加载的资源文件数据,省略磁盘写入中间步骤?
解决方案
你调用LockResource获取到的pMyBinaryData指针已经直接指向当前进程内存中存储的资源原始数据,同时myResourceSize已经拿到了资源的总字节数,完全可以跳过写盘再读的步骤直接在内存操作。
修改后的完整代码
#include <windows.h> #include <iostream> #include <fstream> #include <cstring> using namespace std; int main() { HRSRC myResource = ::FindResource(NULL, "BIN1", RT_RCDATA); unsigned int myResourceSize = ::SizeofResource(NULL, myResource); HGLOBAL myResourceData = ::LoadResource(NULL, myResource); void* pMyBinaryData = ::LockResource(myResourceData); // 直接用内存指针操作,移除写盘读盘逻辑 ofstream out("modified.bin", std::ios::binary); const size_t blockSize = 8192; char buffer[blockSize]; size_t remainingSize = myResourceSize; char* pCur = static_cast<char*>(pMyBinaryData); while (remainingSize > 0) { size_t copySize = min(blockSize, remainingSize); // 把资源内存拷贝到临时缓冲区处理 memcpy(buffer, pCur, copySize); // 对缓冲区做异或处理 for (size_t i = 0; i < copySize; ++i) { buffer[i] ^= 'A'; } // 写入输出文件 out.write(buffer, copySize); // 移动指针、更新剩余长度 pCur += copySize; remainingSize -= copySize; } out.close(); // 注意:资源内存由系统管理,不需要手动释放 return 0; }
关键改动说明
- 移除了原代码中将资源写入
original.bin再读回的冗余逻辑,直接操作pMyBinaryData指向的内存 - 把
pMyBinaryData转成char*类型后就可以按照普通字节指针的方式偏移、读取数据 - 新增了剩余字节计数逻辑,避免处理超过资源实际大小的内存,防止越界访问
- 按块处理的逻辑和原代码保持一致,异或操作逻辑没有改动,最终输出的
modified.bin和原代码输出结果完全相同
注意事项
- 系统加载的资源内存默认是只读的,如果需要直接修改原资源内存的内容,需要先调用
VirtualProtect修改内存页的读写属性,更稳妥的方式是像上面的代码一样先拷贝到自己申请的缓冲区再修改 - 资源内存由Windows系统自动管理,不需要开发者手动调用释放接口,进程退出后系统会自动回收
内容的提问来源于stack exchange,提问作者Key111
相关产品推荐
相关产品推荐

