是否有更快或更有效的方法来获取PE文件中的最后一个bmp资源ID?我有30个+ PE文件,其中一些有1000个bmp reosurces.它们在程序启动时加载,加载所有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;
}
Run Code Online (Sandbox Code Playgroud)
问题解决了!我尝试了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;
}
Run Code Online (Sandbox Code Playgroud)
当然,除了尝试所有可能的资源ID值之外,还有一种更有效的方法.
API函数专门用于枚举加载的PE模块中的资源.看看EnumResourceNames()和EnumResouceNamesEx().
有关详细信息,请参阅MSDN上的枚举资源.
| 归档时间: |
|
| 查看次数: |
81 次 |
| 最近记录: |