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

C++ 查找PE文件中最后一个.bmp资源id的更快或更有效的方法,c++,winapi,C++,Winapi,是否有更快或更有效的方法获取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;

是否有更快或更有效的方法获取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;
}
unsigned int Video::CountResources(HMODULE模块,unsigned int maxid)
{
如果(maxid>9999)maxid=9999;//现在的硬编码值
如果(!模块)返回0;
位图bm;
HBITMAP位图=0;
无符号int last_id=0;

对于(unsigned int resid=0;resid,当然有一种比尝试所有可能的资源ID值更有效的方法

有一些API函数专门用于枚举加载的PE模块中的资源


有关更多信息,请参见MSDN。

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

有一些API函数专门用于枚举加载的PE模块中的资源


有关更多信息,请参见MSDN。

我认为基于
FindResource
而不是
LoadBitmap
的循环会更快。我无法验证这一点,因为我面前没有windows框,但可能值得一试。这里有各种枚举资源的函数,请查看并搜索“MSDN enumerate resources”标题建议您查找“最后一个”。代码示例查找范围内最高的整数资源ID。如果最后一个位图具有名称而不是整数资源ID,该怎么办?@Adrian McCarthy在我的示例中不会,但正如Remy Lebeau建议使用EnumResourceNames()一样,它将同时搜索这两个名称。@WhozCraig使用FindResource()使用EnumResourceNames()编写一个函数,而不是使用LoadBitmap将加载时间增加约50%看看是否可以进一步增加加载时间。我认为基于
FindResource
而不是
LoadBitmap
的循环会更快。我无法验证这一点,因为我面前没有windows框,但可能值得一试。这里有各种枚举资源的函数,请查看并进行搜索“msdn enumerate resources”标题建议您查找“last”一个。代码示例查找范围内最高的整数资源ID。如果最后一个位图具有名称而不是整数资源ID,该怎么办?@Adrian McCarthy在我的情况下不会,但正如Remy Lebeau建议使用EnumResourceNames()它将同时搜索这两个对象。@WhozCraig使用FindResource()而不是LoadBitmap会增加大约50%的加载时间。我将使用EnumResourceNames()编写一个函数,看看是否可以进一步增加加载时间。由于某些原因,我无法让EnumResourceNames()使用位图资源
if(EnumResourceNames)(模块,RT\u位图,(ENUMRESNAMEPROC)EnumNamesFunc,0))
失败,但如果我将RT_BITMAP更改为RT_RCDATA或任何其他资源类型,它会发现这些资源非常好。我对MSDN上的文档印象不深!由于某些原因,我无法让EnumResourceNames()使用位图资源
if(EnumResourceNames(模块,RT_BITMAP,(ENUMRESNAMEPROC)EnumNamesFunc,0))
失败,但如果我将RT_位图更改为RT_RCDATA或任何其他资源类型,它会发现这些资源非常好。MSDN上的文档不会给我留下深刻印象!
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;
}