雖可透過 IShellLink 介面取得捷徑屬性,但理解二進位格式有助於在無 COM 環境下解析,或進行深度偵錯。本文以「Windows Media Player」桌面捷徑為例,逐段解析 .lnk 檔案結構。

| 位移 | 大小/型別 | 說明 |
|---|---|---|
| 0x00 | DWORD | 固定 0x0000004C ('L') |
| 0x04 | 16 bytes | GUID (固定 {00021401-0000-0000-C000-000000000046}) |
| 0x14 | DWORD | Flags:標示後續可選區段是否存在 |
| 0x18 | DWORD | 目標檔案屬性 |
| 0x1C | QWORD | 建立時間 (FILETIME) |
| 0x24 | QWORD | 修改時間 |
| 0x2C | QWORD | 最後存取時間 |
| 0x34 | DWORD | 目標檔案長度 |
| 0x38 | DWORD | 自訂圖示數量 |
| 0x3C | DWORD | 視窗顯示模式 (1=正常, 2=最小化, 3=最大化) |
| 0x40 | DWORD | 熱鍵 |
| 0x44 | 2 DWORD | 保留 (通常為 0) |
| Bit | 意義 |
|---|---|
| 0 | 存在 Shell Item ID List |
| 1 | 指向檔案/資料夾 (0=其他) |
| 2 | 存在描述字串 |
| 3 | 存在相對路徑 |
| 4 | 存在工作目錄 |
| 5 | 存在命令列參數 |
| 6 | 存在自訂圖示 |
對應 WIN32_FIND_DATA.dwFileAttributes,包含 READONLY、HIDDEN、SYSTEM、DIRECTORY、ARCHIVE、ENCRYPTED、TEMPORARY、SPARSE_FILE、REPARSE_POINT、COMPRESSED、OFFLINE 等。
Flags Bit 0 置位時存在。第一個 USHORT 為整個區段總長度,後續為連續 SHITEMID 結構:
typedef struct _SHITEMID { USHORT cb; BYTE abID[0]; } SHITEMID;
cb 為該項目長度,abID 為可變長度識別資料。解析時可直接依總長度跳過此區段。
Flags Bit 1 置位時存在。區段開頭 DWORD 為總長度,接著區段標頭:
| 位移 | 大小 | 說明 |
|---|---|---|
| 0x00 | DWORD | 區段總長度 |
| 0x04 | DWORD | 標頭固定長度 0x1C |
| 0x08 | DWORD | 磁碟機類型旗標 (Bit 0=本機, Bit 1=網路) |
| 0x0C | DWORD | 本機磁碟資訊表區段內位移 (固定 0x1C) |
| 0x10 | DWORD | 本機路徑字串區段內位移 |
| 0x14 | DWORD | 網路磁碟資訊表區段內位移 |
| 0x18 | DWORD | 附加資訊字串區段內位移 |
| 位移 | 說明 |
|---|---|
| 0x00 | 表長度 |
| 0x04 | 磁碟類型 (0=Unknown, 2=Removable, 3=Fixed, 4=Remote, 5=CD-ROM, 6=RAM) |
| 0x08 | 磁碟序號 |
| 0x0C | 固定 0x10 |
| 0x10 | 可變長度磁碟標籤 |
| 位移 | 說明 |
|---|---|
| 0x00 | 表長度 |
| 0x04 | 固定 2 |
| 0x08 | 固定 0x14 |
| 0x0C | 固定 0 |
| 0x10 | 固定 0x20000 |
| 0x14 | 可變長度網路共享名稱 |
結構相同:起始 USHORT 為字元數(Unicode,實際位元組數 ×2),後接字串內容。Flags 對應 Bit 2~6 決定是否存在。
// 標頭
0000: 4C 00 00 00 01 14 02 00 00 00 00 00 C0 00 00 00 00 00 00 46
0014: 8F 00 00 00 // Flags: 有IDL、是檔案、有描述、有相對路徑
0018: 20 00 00 00 // 屬性: ARCHIVE
// 時間、長度等略
// ID List 區段 (總長 0x9C)
004C: 9C 00
004E: 14 00 ... (第一個 SHITEMID)
0062: 19 00 ... (第二個 SHITEMID)
...
00E8: 00 00 // 結束標記
// 檔案位置資訊
00EA: 67 00 00 00 // 區段總長
00EE: 1C 00 00 00
00F2: 01 00 00 00 // 本機磁碟
...
011D: "C:\Program Files\Windows Media Player\wmplayer.exe" (本機路徑)
0150: 00 // 附加資訊為空
// 描述字串 (長度 0x20)
0151: 20 00
0153: ... Unicode "播放數字媒體,包括 音樂、視頻、CD 和 Internet 電台。"
// 相對路徑 (長度 0x38)
0193: 38 00
0195: "..\..\..\Program Files\Windows Media Player\wmplayer.exe"
掌握 .lnk 二進位格式,可在無 Shell 介面環境下解析捷徑,或開發自訂捷徑處理工具。本文提供完整欄位定義與實際數據對照,歡迎開發者擴充為功能完整的解析類別。完整原始碼請參考附件。