gpt4 book ai didi

c++ - 在 PE 文件中查找最后一个 .bmp 资源 ID 的更快或更有效的方法

转载 作者:行者123 更新时间:2023-11-30 00:44:49 25 4
gpt4 key购买 nike

有没有更快或更有效的方法来获取 PE 文件中的最后一个 bmp 资源 ID?我有 30 多个 PE 文件,其中一些包含 1000 多个 bmp 资源。它们在程序启动时加载,加载所有 PE 文件大约需要 1-2 分钟。

unsigned int Video::CountResources(HMODULE module,unsigned int maxid)
{
if(maxid > 9999) maxid = 9999;//hardcode value for now

if(!module)return 0;

BITMAP bm;
HBITMAP bitmap = 0;
unsigned int last_id = 0;

for(unsigned int resid = 0; resid <= maxid; ++resid)
{
if (bitmap) DeleteObject(bitmap);

bitmap = LoadBitmap( module, MAKEINTRESOURCE( 101+resid ) );
if (!bitmap) continue;

if(!GetObject(bitmap,sizeof(bm),reinterpret_cast<LPSTR(&bm))) continue;

last_id = resid;
}
return last_id+1;
}

问题解决了!我尝试了 EnumResourceNames() 其他一些方法和几个 pe_libs。最重要的是所有计算资源的函数都通过资源文件 1 循环迭代到另一个循环,速度没有太大改进,所以我只是修改了我的 CountResources() 函数以使用 FindResource 而不是 LoadBimap 并且对结果感到满意。 实际问题在我的代码中有点深,我检查是否存在预加载模块,如果它不存在,则名为 LoadLibrary() 的模块每次都不存在。我当前的加载时间对于所有 PE 文件是 4 秒。感谢大家的帮助和投入!

unsigned int Video::CountResources(HMODULE module,unsigned int maxid)
{
//hardcode value for now
if(maxid > 9999) maxid = 9999;

if(!module) return 0;

unsigned int last_id = 0;
HRSRC hRes;

for(unsigned int resid = 0; resid <= maxid; ++resid)
{
hRes = FindResource(module, MAKEINTRESOURCE(101+resid ),RT_BITMAP);

if (!hRes) continue;

last_id = resid;
}

return last_id+1;
}

最佳答案

当然有比尝试所有可能的资源 ID 值更有效的方法。

有一些 API 函数专门用于枚举加载的 PE 模块中的资源。看EnumResourceNames()EnumResouceNamesEx() .

参见 Enumerating Resources在 MSDN 上获取更多信息。

关于c++ - 在 PE 文件中查找最后一个 .bmp 资源 ID 的更快或更有效的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46337841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com