|
|
本帖最后由 czjt1234 于 2026-5-19 18:35 编辑
- '仅用于读取控制面板项目的快捷方式
- Option Explicit
- Dim s, control
- Const MYCOMPUTER = "20D04FE0-3AEA-1069-A2D8-08002B30309D" '我的电脑 win95 ~ winxp
- Const CONTROL1 = "21EC2020-3AEA-1069-A2DD-08002B30309D" '控制面板 win95 ~ winvista
- Const CONTROL2 = "26EE0668-A00A-44D7-9371-BEB064C98683" '控制面板 win7 ~ win11
- s = "设备和打印机 - 快捷方式.lnk"
- Call RunAsCmd()
- If wsh.Arguments.Count > 0 Then s = wsh.Arguments(0)
- wsh.Echo s & vbCrLf & vbCrLf & LinkTargetIDList(s)
- Function LinkTargetIDList(ByVal lnkFilePath)
- Dim oStream, arrByte, m, n, s
- Set oStream = CreateObject("ADODB.Stream")
- oStream.Type = 1 'adTypeBinary
- oStream.Mode = 3 'adModeReadWrite
- oStream.Open()
- oStream.LoadFromFile lnkFilePath
- oStream.Position = &H004C
- arrByte = oStream.Read(2)
- m = bin2Hex(arrByte, 2, 1)
- LinkTargetIDList = ": &H" & Right("000" & Hex(&H004C + 2 + CLng(m)), 4)
- s = "LinkTargetIDList : &H004C" & vbCrLf & _
- " IDListSize : &H004C = " & m & vbCrLf & _
- " IDList : &H004E" & vbCrLf & _
- " ItemIDList : &H004E" & vbCrLf
- Do
- n = "&H" & Right("000" & Hex(oStream.Position), 4)
- arrByte = oStream.Read(2)
- m = bin2Hex(arrByte, 2, 1)
- If m = "&H0000" Then
- s = s & " TerminalID : " & n & " = " & m & vbCrLf
- Exit Do
- End If
- s = s & " ItemIDSize : " & n & " = " & m & vbCrLf
- n = "&H" & Right("000" & Hex(oStream.Position), 4)
- arrByte = oStream.Read(CLng(m) - 2)
- s = s & " Data : " & n & vbCrLf & getData(arrByte, n)
- Loop
- LinkTargetIDList = s & LinkTargetIDList
- End Function
- Function getData(ByRef arrByte, ByVal p)
- Dim i, m, n, s, a, b
- i = LenB(arrByte)
- n = bin2Hex(arrByte, 1, i)
- Select Case Left(n, 4)
- Case "&H1F" '根路径
- s = " ClassType : " & p & " = &H1F" & vbCrLf
- p = "&H" & Right("000" & Hex(CLng(p) + 1), 4)
- n = bin2Hex(arrByte, 2, 2)
- s = s & " SortIndex : " & p & " = " & n & vbCrLf
- p = "&H" & Right("000" & Hex(CLng(p) + 1), 4)
- n = hex2GUID(bin2Hex(arrByte, 3, i))
- control = n
- s = s & " GUID : " & p & " = " & n & getGUID_Name(n) & vbCrLf
- Case Else
- If i = 10 Then '类别 winvista ~ win11
- m = "shell:::{" & control & "}\" & CInt("&H" & Mid(n, 16, 1))
- m = " (" & CreateObject("Shell.Application").NameSpace(m).Title & ")"
- s = " 未知结构 : " & p & " = " & n & m & vbCrLf
- ElseIf i = 18 Then '控制面板的GUID win95 ~ winxp
- s = " 未知结构 : " & p & " = " & Left(n, 6) & vbCrLf
- p = "&H" & Right("000" & Hex(CLng(p) + 2), 4)
- n = hex2GUID(Right(n, 32))
- control = n
- s = s & " GUID : " & p & " = " & n & getGUID_Name(n) & vbCrLf
- ElseIf i = 28 Then 'winxp ~ win11
- s = " 未知结构 : " & p & " = " & Left(n, 26) & vbCrLf
- p = "&H" & Right("000" & Hex(CLng(p) + 12), 4)
- n = hex2GUID(Right(n, 32))
- s = s & " GUID : " & p & " = " & n & getGUID_Name(n) & vbCrLf
- ElseIf Right(n, 4) = "0000" Then 'Unicode winxp ~ win11
- s = " 未知结构 : " & p & " = " & Left(n, 22) & "..." & vbCrLf
- p = "&H" & Right("000" & Hex(CLng(p) + 18), 4)
- a = "&H" & Mid(n, 41, 2) & Mid(n, 39, 2)
- s = s & " 名称偏移 : " & p & " = " & a & vbCrLf
- p = "&H" & Right("000" & Hex(CLng(p) + 2), 4)
- b = "&H" & Mid(n, 45, 2) & Mid(n, 43, 2)
- s = s & " 简介偏移 : " & p & " = " & b & vbCrLf
- a = CLng(a)
- b = CLng(b)
- p = "&H" & Right("000" & Hex(CLng(p) + 2), 4)
- m = unicode2chr(Mid(n, 47, a * 4))
- s = s & " 目标文件 : " & p & " = " & m & vbCrLf
- p = "&H" & Right("000" & Hex(CLng(p) + a * 2), 4)
- m = unicode2chr(Mid(n, 47 + a * 4, b * 4 - a * 4))
- If Mid(n, 31, 2) = "01" Then m = m & " (32 位)"
- s = s & " 名称 : " & p & " = " & m & vbCrLf
- p = "&H" & Right("000" & Hex(CLng(p) + b * 2 - a * 2 ), 4)
- m = unicode2chr(Mid(n, 47 + b * 4))
- s = s & " 简介 : " & p & " = " & m & vbCrLf
- Else 'ANSI (GBK) win95 win98
- s = " 未知结构 : " & p & " = " & Left(n, 14) & vbCrLf
- p = "&H" & Right("000" & Hex(CLng(p) + 6), 4)
- a = "&H" & Mid(n, 17, 2) & Mid(n, 15, 2)
- s = s & " 名称偏移 : " & p & " = " & a & vbCrLf
- p = "&H" & Right("000" & Hex(CLng(p) + 2), 4)
- b = "&H" & Mid(n, 21, 2) & Mid(n, 19, 2)
- s = s & " 简介偏移 : " & p & " = " & b & vbCrLf
- a = CLng(a)
- b = CLng(b)
- p = "&H" & Right("000" & Hex(CLng(p) + 2), 4)
- m = gbk2chr(Mid(n, 23, a * 2))
- s = s & " 目标文件 : " & p & " = " & m & vbCrLf
- p = "&H" & Right("000" & Hex(CLng(p) + a), 4)
- m = gbk2chr(Mid(n, 23 + a * 2, b * 2 - a * 2))
- s = s & " 名称 : " & p & " = " & m & vbCrLf
- p = "&H" & Right("000" & Hex(CLng(p) + b - a), 4)
- m = gbk2chr(Mid(n, 23 + b * 2))
- s = s & " 简介 : " & p & " = " & m & vbCrLf
- End If
- End Select
- getData = s
- End Function
- Function hex2GUID(ByVal s)
- Dim arr, m, i
- s = RePlace(s, "&H", "")
- s = RePlace(s, " ", "")
- arr = Array(7, 8, 5, 6, 3, 4, 1, 2, 11, 12, 9, 10, 15, 16, 13, 14)
- m = ""
- For i = 1 To 16
- m = m & Mid(s, arr(i - 1), 1)
- If i = 8 Or i = 12 Or i = 16 Then m = m & "-"
- Next
- For i = 17 To 32
- m = m & Mid(s, i, 1)
- If i = 20 Then m = m & "-"
- Next
- hex2GUID = m
- End Function
- Sub RunAsCmd()
- Dim oFSO, oWshShell, s, i
- Set oFSO = CreateObject("Scripting.FileSystemObject")
- Set oWshShell = CreateObject("WScript.Shell")
- s = oWshShell.ExpandEnvironmentStrings("%windir%\System32\CScript.exe")
- If LCase(WScript.FullName) <> LCase(s) Then
- s = s & " /nologo """ & WScript.ScriptFullName & """"
- For Each i In WScript.Arguments
- s = s & " """ & i & """"
- Next
- oWshShell.Run "cmd.exe /k " & s
- WScript.Quit()
- End If
- End Sub
- Function bin2Hex(ByRef arrByte, ByVal m, ByVal n)
- Dim k, i, s
- k = 1
- If n < m Then k = -1
- s = "&H"
- For i = m To n Step k
- s = s & Right("0" & Hex(AscB(MidB(arrByte, i, 1))), 2)
- Next
- bin2Hex = s
- End Function
- Function getGUID_Name(ByVal t)
- Dim oWshShell, s, n
- If t = MYCOMPUTER Then getGUID_Name = " (我的电脑)" : Exit Function
- If t = CONTROL1 Or t = CONTROL2 Then
- getGUID_Name = " (控制面板)"
- Exit Function
- End If
- s = "HKEY_CLASSES_ROOT\CLSID\{" & t & "}\"
- getGUID_Name = ""
- Set oWshShell = CreateObject("WScript.Shell")
- Err.Clear()
- On Error Resume Next
- n = oWshShell.RegRead(s)
- If oWshShell.Run("cmd.exe /c set | find.exe /i ""powershell"" && exit /b 6", 0, True) <> 6 Then
- getGUID_Name = " (" & n & ")"
- Exit Function
- End If
- If Err.Number <> 0 Then Exit Function
- s = s & "LocalizedString"
- Err.Clear()
- n = oWshShell.RegRead(s)
- If Err.Number <> 0 Then Exit Function
- With CreateObject("VBScript.RegExp")
- .Pattern = "^(.+-\d+)(#.+)?"
- n = .Execute(n)(0).SubMatches(0)
- End With
- getGUID_Name = getDllString(n)
- End Function
- Function getDllString(ByVal n)
- Dim oWshShell, oWshScriptExec, s, i
- Set oWshShell = CreateObject("WScript.Shell")
- Set oWshScriptExec = oWshShell.Exec("cmd.exe")
- s = """" & RePlace(wsh.ScriptFullName, wsh.ScriptName, "") & "ReadDllString.ps1"""
- s = "PowerShell.exe -NoProfile -Exec Bypass -F " & s & " -ResourceString """ & n & """"
- With oWshScriptExec.StdIn
- .WriteLine "@echo off & " & s
- .Close()
- End With
- With oWshScriptExec.StdOut
- s = .ReadAll()
- .Close()
- End With
- With CreateObject("VBScript.RegExp")
- .Pattern = "[\s\S]+\n(.+)"
- s = .Execute(s)(0).SubMatches(0)
- End With
- getDllString = " (" & s & ")"
- End Function
- Function unicode2chr(ByVal m)
- Dim s, i, n
- m = RePlace(m, "&H", "")
- m = RePlace(m, " ", "")
- s = ""
- n = "&H"
- For i = 1 To Len(m) Step 4
- n = n & Mid(m, i + 2, 1) & Mid(m, i + 3, 1) & Mid(m, i, 1) & Mid(m, i + 1, 1)
- If CLng(n) <> 0 Then s = s & ChrW(CLng(n))
- n = "&H"
- Next
- unicode2chr = s
- End Function
- Function gbk2chr(ByVal m)
- Dim s, i, n
- m = RePlace(m, "&H", "")
- m = RePlace(m, " ", "")
- s = ""
- n = "&H"
- For i = 1 To Len(m) Step 2
- n = n & Mid(m, i, 1) & Mid(m, i + 1, 1)
- If CLng(n) > CLng(&H7F) Then
- i = i + 2
- n = n & Mid(m, i, 1) & Mid(m, i + 1, 1)
- End If
- If CLng(n) <> 0 Then s = s & Chr(CLng(n))
- n = "&H"
- Next
- gbk2chr = s
- End Function
复制代码 仅用于读取控制面板项目的快捷方式
在 winxp_x86_sp3 winvista_x64_sp2 win7_x64_sp1 win8_x64 win8.1_x64 win10_x64_22H2 win11_x64_22H2 测试通过
winvista及更新的系统由于要读取dll文件里的中文字符串,所以要调用powershell,见3楼
不调用powershell则会显示快捷方式的英文名
winvista原版没有powershell, 需要安装补丁kb968930并重启
|
|