快捷方式 (.lnk) 属性与图标提取

快捷方式(.lnk)是 Windows 桌面的基石。提取它的图标和元数据(如备注)需要深入 Win32 COM 接口。

1. 解析 LNK 元数据

要获取快捷方式指向的路径或用户定义的描述,需要使用 IShellLinkW 接口。

核心步骤

  1. 创建实例CoCreateInstance(&ShellLink, ...)
  2. 加载文件:通过 IPersistFile 接口调用 Load 方法加载 .lnk 路径。
  3. 读取描述:调用 GetDescription 获取用户在属性窗口中填写的“备注”。

2. 提取图标:从 ShellItem 到 Base64

直接读取 .ico 文件可能不准确,因为很多应用使用内部资源索引。最稳健的方法是利用 Shell 的缩略图缓存接口。

技术实现:IShellItemImageFactory

  1. 转换为 IShellItem:将路径转换为 Shell 项目。
  2. 请求图像:转型为 IShellItemImageFactory,调用 GetImage
    • 标志位:使用 SIIGBF_BIGGERSIZEOK | SIIGBF_ICONONLY 获取原始质量的图标。
  3. 处理 HBITMAP
    • HBITMAP 像素数据读入缓冲区。
    • 特别注意:许多 Windows 图标只有 RGB 通道,Alpha 通道全为零。如果检测到所有 Alpha 均为 0,需要强制设置为 255(不透明),否则图标会“消失”。
  4. 编码:将图像编码为 PNG 的 Base64 字符串,方便前端 <img> 标签直接展示。

3. 常见陷阱

  • COM 线程模型:操作 Shell 接口前必须初始化 CoInitializeEx(建议使用 COINIT_APARTMENTTHREADED)。
  • 内存泄漏HBITMAPCoTaskMem 分配的内存必须手动释放。
  • 图标尺寸:请求 64x64 或 128x128 通常能获得兼顾性能与清晰度的结果。

4. 结语

通过 Shell API 提取图标不仅能获得最准确的图像(包含叠加层),还能利用 Windows 的图像缓存,是构建高效启动器的不二之选。