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

ins*_*iac 1 c++ winapi

是否有更快或更有效的方法来获取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)

val*_*ldo 6

当然,除了尝试所有可能的资源ID值之外,还有一种更有效的方法.

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

有关详细信息,请参阅MSDN上的枚举资源.