直接用IShellLink+IPersistFile是唯一稳定可靠的方式;手撕.lnk二进制格式极易因ExtraData、CLSID变体、Unicode编码差异及OneDrive/AppContainer等现代路径场景崩溃,且fopen无法正确解析其COM序列化结构,必须依赖系统Shell接口处理。

直接用 IShellLink + IPersistFile 是唯一稳定可靠的方式;手撕二进制结构看似自由,实际在 Win10/Win11 上极易因扩展块(ExtraData)、CLSID 变体或 Unicode 编码差异崩溃,且无法处理 OneDrive 重定向、AppContainer 沙箱路径等现代场景。
为什么不能 fopen 读 .lnk 文件再解析头?
因为 .lnk 不是普通二进制容器,而是 COM 对象序列化格式:前 4 字节是 0x4C 0x00 0x00 0x00(即 ASCII 'L' + 三个零),但后续包含 DOS 头模拟、CLSID、可变长 IDList、字符串区和多版本 ExtraData。手动解析必须严格按 MS-SHLLINK 规范逐字段跳转,稍有偏差就解出乱码或越界访问。
常见错误现象:
-
fopen("xxx.lnk", "rb")读出几百字节后std::string构造失败,含嵌入