(一)最近要熟悉新工作中一個軟件打包腳本工具NSIS,學了一個下午,知道了大概,由於需求要獲取機器的Mac地址,先上網擺渡了一下,發現了一個牛人的留言,沒有用到NSIS的插件,現代碼整理如下:
1 Name "GetMacAddressWithoutPlugin" 2 OutFile "GetMacAddressWithoutPlugin.exe" 3 ShowInstDetails show 4 5 #此例子轉自CSDN上一個牛人的回覆,目前我還沒弄明白那參數是什麼意思,怎麼傳的,希望熱心牛人給予解釋 6 7 8 # ------ 引入Logiclib.nsh宏來提供各種邏輯基本語句,不需要預先添加函數 ------ 9 !include "Logiclib.nsh" 10 11 Var "MacAddress" 12 13 Function .GetMacAddress 14 System::Call Iphlpapi::GetAdaptersInfo(i,*i.r0) 15 System::Alloc $0 16 Pop $1 17 System::Call Iphlpapi::GetAdaptersInfo(ir1r2,*ir0)i.r0 18 StrCmp $0 0 0 finish 19 loop: 20 StrCmp $2 0 finish 21 System::Call '*$2(i.r2,i,&t260.s,&t132.s,i.r5)i.r0' ;Unicode版將t改爲m 22 IntOp $3 403 + $5 23 StrCpy $6 "" 24 ${For} $4 404 $3 25 IntOp $7 $0 + $4 26 System::Call '*$7(&i1.r7)' 27 IntFmt $7 "%02X" $7 28 StrCpy $6 "$6$7" 29 StrCmp $4 $3 +2 30 StrCpy $6 "$6-" 31 ${Next} 32 StrCpy $MacAddress $6 33 Goto loop 34 finish: 35 System::Free $1 36 FunctionEnd 37 38 Section 39 40 Call .GetMacAddress 41 DetailPrint "當前機器Mac地址爲: $MacAddress" 42 43 SectionEnd
1.首先要引入Logiclib.nsh宏定義。
2.通過調用系統函數來完成對Mac地址的獲取。
3.此代碼生成的可執行文件大小爲40kb。
4.望哪位熱心大牛能給解釋下調用系統函數時傳遞的參數的意思,拜謝!
我是把它寫在一個函數中了,有需要的,可以像我一樣定義一個全局變量“MacAddress”,將取到的值賦給“$MacAddress”以留備用。
此代碼在本人機器上運行結果如下:
(二)本人調用兩個插件完成對機器Mac地址的獲取,代碼比調用系統函數的清晰易讀,現整理代碼如下:
1 Name "GetMacAddress" 2 OutFile "GetMacAddress.exe" 3 ShowInstDetails show 4 5 #Author: Kylin 2011/10/12 6 Var "IpAddress" 7 8 #根據Ip獲取Mac地址(需要下載IpConfig插件) 9 Function .GetMacAddress 10 11 #獲取IP 12 Ip::get_ip 13 Pop $0 14 #除去得到的IP後邊的";"號(得到的IP格式爲,例如: 172.16.16.217;) 15 StrCpy $IpAddress $0 -1 16 ;DetailPrint $IpAddress 17 18 #根據得到的IP獲取對應網卡的ID 19 IpConfig::GetNetworkAdapterIDFromIPAddress $IpAddress 20 Pop $1 21 Pop $2 22 StrCmp $1 "ok" 0 error 23 ;DetailPrint "$1 , $2" 24 25 #根據獲取的網卡ID得到對應的Mac地址 26 IpConfig::GetNetworkAdapterMACAddress $2 27 Pop $3 28 Pop $4 29 ;DetailPrint "$3 , $4 " 30 DetailPrint "MacAddress from Adapter #$2: $4" 31 Goto end 32 33 error: 34 DetailPrint "未獲取到IP爲$IpAddress的Mac地址!" 35 end: 36 37 FunctionEnd 38 39 Section doTest 40 41 Call .GetMacAddress 42 43 SectionEnd
1.此段代碼需要調用兩個插件,一個是ip.dll,用來獲取當前機器的IPi地址;另一個是ipConfig.dll,用來獲取Mac地址。
2.首先先獲取機器的IP地址,然後根據處理後的IP地址結果(處理成正常的IP格式,如:xxx.xx.xx.xxx)獲取Adapter的ID號,最後通過Adapter的ID號獲取機器的Mac地址。
3.如果NSIS安裝文件的根目錄中Plugins文件下沒有上述兩個dll文件,請先到NSIS插件網站下載後,放入到Plugins文件中,方可進行運行調試。
4.此代碼生成的可執行文件大小爲98kb,比上一個大了一倍多 - -!。
我是把它寫在一個函數中了,有需要的,可以定義一個全局變量“MacAddress”,將取到的值賦給“$MacAddress”以留備用。
此代碼在本人機器上運行結果如下:
最後總結下,調用插件的確比較佔空間,對於一向以追求以最小空間完成打包程序的NSIS來說,前者調用系統函數更好些;如果不追求升那點空間,我個人更覺得後者更合適。
如有不明白的請留言詢問,如有不對之處,望請指出!(此爲本人第一篇技術文章,望大家多支持)