快捷方式 (.lnk) 属性与图标提取
快捷方式(.lnk)是 Windows 桌面的基石。提取它的图标和元数据(如备注)需要深入 Win32 COM 接口。
¶1. 解析 LNK 元数据
要获取快捷方式指向的路径或用户定义的描述,需要使用 IShellLinkW 接口。
¶核心步骤
- 创建实例:
CoCreateInstance(&ShellLink, ...)。 - 加载文件:通过
IPersistFile接口调用Load方法加载.lnk路径。 - 读取描述:调用
GetDescription获取用户在属性窗口中填写的“备注”。
¶2. 提取图标:从 ShellItem 到 Base64
直接读取 .ico 文件可能不准确,因为很多应用使用内部资源索引。最稳健的方法是利用 Shell 的缩略图缓存接口。
¶技术实现:IShellItemImageFactory
- 转换为 IShellItem:将路径转换为 Shell 项目。
- 请求图像:转型为
IShellItemImageFactory,调用GetImage。- 标志位:使用
SIIGBF_BIGGERSIZEOK | SIIGBF_ICONONLY获取原始质量的图标。
- 标志位:使用
- 处理 HBITMAP:
- 将
HBITMAP像素数据读入缓冲区。 - 特别注意:许多 Windows 图标只有 RGB 通道,Alpha 通道全为零。如果检测到所有 Alpha 均为 0,需要强制设置为 255(不透明),否则图标会“消失”。
- 将
- 编码:将图像编码为 PNG 的 Base64 字符串,方便前端
<img>标签直接展示。
¶3. 常见陷阱
- COM 线程模型:操作 Shell 接口前必须初始化
CoInitializeEx(建议使用COINIT_APARTMENTTHREADED)。 - 内存泄漏:
HBITMAP和CoTaskMem分配的内存必须手动释放。 - 图标尺寸:请求 64x64 或 128x128 通常能获得兼顾性能与清晰度的结果。
¶4. 结语
通过 Shell API 提取图标不仅能获得最准确的图像(包含叠加层),还能利用 Windows 的图像缓存,是构建高效启动器的不二之选。