我寫這個腳本來幫助這個帖子裡的 rpetges。它可以讀取一個註冊表 REG_MULTI_SZ 類型的鍵值並輸出。當然不要忘了修改標有 「修改這裡」 的地方。該註冊表鍵必須為 REG_MULTI_SZ 類型,否則將顯示錯誤。
OutFile "REG_MULTI_SZ Reader.exe"
Name "REG_MULTI_SZ Reader"
ShowInstDetails show
!define HKEY_CLASSES_ROOT 0x80000000
!define HKEY_CURRENT_USER 0x80000001
!define HKEY_LOCAL_MACHINE 0x80000002
!define HKEY_USERS 0x80000003
!define HKEY_PERFORMANCE_DATA 0x80000004
!define HKEY_PERFORMANCE_TEXT 0x80000050
!define HKEY_PERFORMANCE_NLSTEXT 0x80000060
!define HKEY_CURRENT_CONFIG 0x80000005
!define HKEY_DYN_DATA 0x80000006
!define KEY_QUERY_VALUE 0x0001
!define KEY_ENUMERATE_SUB_KEYS 0x0008
!define REG_NONE 0
!define REG_SZ 1
!define REG_EXPAND_SZ 2
!define REG_BINARY 3
!define REG_DWORD 4
!define REG_DWORD_LITTLE_ENDIAN 4
!define REG_DWORD_BIG_ENDIAN 5
!define REG_LINK 6
!define REG_MULTI_SZ 7
!define RegOpenKeyEx "Advapi32::RegOpenKeyExA(i, t, i, i, i) i"
!define RegQueryValueEx "Advapi32::RegQueryValueExA(i, t, i, i, i, i) i"
!define RegCloseKey "Advapi32::RegCloseKeyA(i) i"
####### 編輯這裡!
!define ROOT_KEY ${HKEY_CURRENT_USER}
!define SUB_KEY "Software\Joe Software"
!define VALUE "Strings"
####### 停止編輯
Section "Read"
StrCpy $0 ""
StrCpy $1 ""
StrCpy $2 ""
StrCpy $3 ""
SetPluginUnload alwaysoff ;插件調用設定為全部不卸載以提高速度
System::Call "*(i) i (0) .r0"
System::Call "*(i) i (0) .r1"
System::Call "*(i) i (0) .r2"
System::Call "${RegOpenKeyEx}(${ROOT_KEY}, '${SUB_KEY}', \
0, ${KEY_QUERY_VALUE}|${KEY_ENUMERATE_SUB_KEYS}, r0) .r3"
StrCmp $3 0 goon
MessageBox MB_OK|MB_ICONSTOP "不能開啟註冊表鍵! ($3)"
Goto done
goon:
System::Call "*$0(&i4 .r4)"
System::Call "${RegQueryValueEx}(r4, '${VALUE}', 0, r1, 0, r2) .r3"
StrCmp $3 0 read
MessageBox MB_OK|MB_ICONSTOP "不能搜尋註冊表值! ($3)"
Goto done
read:
System::Call "*$1(&i4 .r3)"
StrCmp $3 ${REG_MULTI_SZ} multisz
MessageBox MB_OK|MB_ICONSTOP "註冊表值不是 SZ_MULTI_SZ! ($3)"
Goto done
multisz:
System::Call "*$2(&i4 .r3)"
StrCmp $3 0 0 multiszalloc
MessageBox MB_OK|MB_ICONSTOP "註冊表值為空! ($3)"
Goto done
multiszalloc:
System::Free $1
System::Alloc $3
Pop $1
StrCmp $1 0 0 multiszget
MessageBox MB_OK|MB_ICONSTOP "不能分配足夠的記憶體! ($3)"
Goto done
multiszget:
System::Call "${RegQueryValueEx}(r4, '${VALUE}', 0, 0, r1, r2) .r3"
StrCmp $3 0 multiszprocess
MessageBox MB_OK|MB_ICONSTOP "不能搜尋註冊表值! ($3)[2]"
Goto done
multiszprocess:
StrCpy $4 $1
loop:
System::Call "*$4(&t${NSIS_MAX_STRLEN} .r3)"
StrCmp $3 "" done
DetailPrint $3
StrLen $5 $3
IntOp $4 $4 + $5
IntOp $4 $4 + 1 ;REG_MULTI_SZ 類型以一個 NULL 來分隔
Goto loop
done:
System::Free $2
System::Free $1
StrCmp $0 0 noClose
System::Call "${RegCloseKey}(r0)"
noClose:
SetPluginUnload manual ;插件調用改為正常
System::Free $0 ;最後一次插件調用必須卸載
SectionEnd
written by KiCHiK