12

我想在我的 dll 中获取常见文件类型的图标。我正在使用 vc++。我只有文件的文件扩展名和 mime 类型,我想根据这些文件获取文件的图标。

有人可以告诉我我该怎么做吗?(vc++ 中可用的方法需要用户提供需要图标的文件的路径。我无权访问任何此类文件)

谢谢。

4

2 回答 2

20

外壳 API

SHGetFileInfo()您可以通过与标志一起调用来从 shell 中获取它们SHGFI_USEFILEATTRIBUTES- 此标志允许例程工作而不需要传入的文件名实际存在,因此如果您有文件扩展名,只需组成一个文件名,附加扩展名,然后传递它在。

通过组合其他标志,您将能够检索:

  • 由系统配置决定的大图标或小图标SHGFI_ICON|SHGFI_LARGEICONSHGFI_ICON|SHGFI_SMALLICON
  • 由外壳配置确定的大图标或小图标SHGFI_ICON|SHGFI_LARGEICON|SHGFI_SHELLICONSIZESHGFI_ICON|SHGFI_SMALLICON|SHGFI_SHELLICONSIZE
  • shell 的图像列表中的图标索引以及相应的图像列表:SHGFI_SYSICONINDEX
  • 存储图标的实际模块的路径和文件名(以及该模块中的图标索引):SHGFI_ICONLOCATION

例子

// Load a System Large icon image
SHGetFileInfo( szFileName, FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(SHFILEINFO), 
   SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_LARGEICON);

// Load a System Small icon image
SHGetFileInfo( szFileName, FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(SHFILEINFO), 
   SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_SMALLICON);

// Load a Shell Large icon image
SHGetFileInfo( szFileName, FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(SHFILEINFO), 
   SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_SHELLICONSIZE);

// Load a Shell Small icon image
SHGetFileInfo( szFileName, FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(SHFILEINFO), 
   SHGFI_USEFILEATTRIBUTES 
   | SHGFI_ICON | SHGFI_SHELLICONSIZE | SHGFI_SMALLICON);

如果要绘制这样的图标,请使用以下内容:

// Draw it at its native size
DrawIconEx( hDC, nLeft, nTop, hIcon, 0, 0, 0, NULL, DI_NORMAL );

// Draw it at the System Large size
DrawIconEx( hDC, nLeft, nTop, hIcon, 0, 0, 0, 
            NULL, DI_DEFAULTSIZE | DI_NORMAL );

// Draw it at some other size (40x40 in this example)
DrawIconEx( hDC, nLeft, nTop, hIcon, 40, 40, 0, NULL, DI_NORMAL );

SHFILEINFO可以从结构中获取图标句柄以及文件系统路径:

typedef struct _SHFILEINFOA
{
        HICON       hIcon;                      // out: icon
        int         iIcon;                      // out: icon index
        DWORD       dwAttributes;               // out: SFGAO_ flags
        CHAR        szDisplayName[MAX_PATH];    // out: display name (or path)
        CHAR        szTypeName[80];             // out: type name
} SHFILEINFOA;

请记住,您必须在完成后通过传递hIcon来释放获得的图标。DestroyIcon()

于 2009-02-07T17:30:39.707 回答
-3

从注册表中识别图标信息、关联的文件类型和处理文件的程序并从文件中提取图标。 http://www.codeproject.com/KB/shell/iconextract.aspx

于 2009-02-07T17:25:27.767 回答