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

时间:2017-09-21 07:24:21

标签: c++ winapi

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

1 个答案:

答案 0 :(得分:6)

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

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

有关详细信息,请参阅MSDN上的Enumerating Resources