C++ 查找PE文件中最后一个.bmp资源id的更快或更有效的方法
是否有更快或更有效的方法获取PE文件中的最后一个bmp资源id?我有30多个PE文件,其中一些包含1000个bmp。当程序启动时,它们被加载。加载所有PE文件大约需要1-2分钟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;
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;
}