是否有更快或更有效的方法来获取PE文件中的最后一个bmp资源ID?我有30 + PE文件,其中一些有bmp reosurces 1000。它们在程序启动时加载,加载所有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;
}
答案 0 :(得分:6)
当然,除了尝试所有可能的资源ID值之外,还有一种更有效的方法。
有一些API函数专门用于枚举加载的PE模块中的资源。查看EnumResourceNames()
和EnumResouceNamesEx()
。
有关详细信息,请参阅MSDN上的Enumerating Resources。