我怎么知道下一个SHGetFileInfo(SHGFI_ICON)调用是否会缓慢(对于exe文件等)?

时间:2014-04-15 07:42:11

标签: windows winapi icons

我正在写一个文件管理器。当它打开时,UI会冻结一段时间。我对它进行了分析,发现缓慢的函数是SHGetFileInfo

SHFILEINFO shinfo;
SHGetFileInfo(FullPath.c_str(), NULL, &shinfo, sizeof(shinfo),
    SHGFI_ICON | SHGFI_LARGEICON))

此外,即使有数百个文件夹,程序运行得足够快,但当至少有一个可执行文件时,程序变得非常慢。我认为从这些文件加载​​图标是一项繁重的任务,因为必须加载资源。

我看到当Windows资源管理器加载文件夹时,除可执行文件之外的所有图标都是正确的,可执行文件具有默认图标(命令行实用程序的图标)。然后他们的图标会在几秒钟内变得正确。

我的问题是资源管理器如何确定哪些图标加载速度快,哪些图标速度慢?我认为检查扩展程序.exe是不可靠的,因为可能会assoc .foo=exefile或将另一个扩展程序的图标设置为%1等。

1 个答案:

答案 0 :(得分:2)

Windows shell使用了几种机制来处理这种性能损失:

  1. 它在后台线程中查找图标。当这个线程正在运行时,资源管理器仍然可以完全使用。
  2. 资源管理器缓存图标。这意味着图标提取仅执行一次,结果将被记住。
  3. 我认为如果您希望文件管理器与Explorer一样可用,那么您需要实现类似的优化。或许SHGetFileInfo已经利用了系统图标缓存。

    这些与shell图标性能相关的文章可能对您有用: