1. 程式人生 > >NSIS獲取本機IP地址寫入配置檔案

NSIS獲取本機IP地址寫入配置檔案

安裝一個應用程式的時候需要獲取當前的網絡卡IP地址,即伺服器IP地址,同時寫入到配置檔案。NSIS提供了獲取IP地址的外掛,IP-plugin,詳情請看:http://nsis.sourceforge.net/IP_plug-in

外掛安裝很簡單,只需要下載dll檔案,拷貝到NSIS安裝目錄的plugin目錄下即可。如果還有其它檔案如nsi檔案,另見外掛安裝說明。

Nsis程式碼 複製程式碼
  1. outfile IpTest.exe   
  2. name IpTest   
  3. ; get_ip example   
  4. ; by Hendri Adriaens   
  5. [email protected]   
  6. ;   
  7. ; Usage:   
  8. ; ip::get_ip   
  9. ; Output: 'ip1;ip2;ip3;ip4;'
  10. ; (semi-colon delimited IP's list, on stack)   
  11. ;   
  12. ; Uses NSIS script to retrieve   
  13. ; separate IP-addresses and to   
  14. ; test whether or not it is an   
  15. ; internet IP-address. Based on   
  16. ; information by Joost Verburg:   
  17. ;   These ranges are for local networks:    
  18. ;   10.x.x.x / 255.0.0.0
  19. ;   172.16.x.x / 255.255.0.0 to 172.31.x.x / 255.255.0.0
  20. ;   192.168.x.x / 255.255.255.0
  21. ;   169.254.x.x / 255.255.0.0
  22. ; and:   
  23. ;   169.254.x.x is an Automatic Private IP Address,   
  24. ;   which you get when there is no DHCP server available,   
  25. ;   for example, Windows gives these addresses when you check   
  26. ;   "Obtain an IP address automatically" and you have no DHCP server.   
  27. ;   
  28. ; Further information has also been found at:   
  29. ; http://home.t-online.de/home/TschiTschi/ip_adressierung.htm   
  30. ;   
  31. ; Script supplies two funcions:   
  32. ; GetNextIp : get any IP (network and internet)   
  33. ; CheckIP   : determine IP type (see function header for available types)   
  34. ; Script uses the VersionCheck   
  35. ; function to test IP's.   
  36. Section   
  37.   ; Code to use actual ExtensionDLL   
  38.   ; Current script provides an example   
  39.   ip::get_ip   
  40.   Pop $0
  41.   ; test entry   
  42.   ;StrCpy $0'192.168.0.100;127.0.0.1;152.168.0.101;169.254.0.1;'
  43.   Loop:   
  44.   Push $0
  45.   Call GetNextIp   
  46.   Call CheckIp   
  47.   Pop $2 ; Type of current IP-address   
  48.   Pop $1 ; Current IP-address   
  49.   Pop $0 ; Remaining addresses   
  50.   StrCmp $2'1''' NoLoopBackIp   
  51.     MessageBox MB_OK "LoopBack IP-address: $1"
  52.     Goto Continue   
  53.   NoLoopBackIp:   
  54.   StrCmp $2'2''' NoAPA   
  55.     MessageBox MB_OK "Automatic Private IP-address: $1"
  56.     Goto Continue   
  57.   NoAPA:   
  58.   StrCmp $2'3''' NoLanIp   
  59.     MessageBox MB_OK "Network IP-address: $1"
  60.     Goto Continue   
  61.   NoLanIp:   
  62.   MessageBox MB_OK "Internet IP-address: $1"
  63.   Continue:   
  64.   StrCmp $0'' ExitLoop Loop   
  65.   ExitLoop:   
  66. SectionEnd   
  67. ; Function GetNextIp   
  68. ; input: head of stack   
  69. ; format: 'ip1;ip2;ip3;ip4;'
  70. ; output: 'ip1' head of stack   
  71. ;         'ip2;ip3;ip4;' second entry of stack   
  72. Function GetNextIp   
  73.   Exch $0
  74.   Push $1
  75.   Push $2
  76.   Strcpy $20             ; Counter   
  77.   Loop:   
  78.     IntOp $2 $2 + 1
  79.     StrCpy $1 $01 $2
  80.     StrCmp $1'' ExitLoop   
  81.     StrCmp $1';''' Loop   
  82.     StrCpy $1 $0 $2       ; IP-address   
  83.     IntOp $2 $2 + 1
  84.     StrCpy $0 $0'' $2    ; Remaining string   
  85.   ExitLoop:   
  86.   Pop $2
  87.   Push $0
  88.   Exch 2
  89.   Pop $0
  90.   Exch $1
  91. FunctionEnd   
  92. ; Function CheckIP   
  93. ; input: IP-address on stack   
  94. ; output: additional entry on stack   
  95. ;         1 - LoopBack IP (localhost, indicates no connection to a LAN or to the internet).   
  96. ;         2 - Automatic Private IP Address (no DHCP server).   
  97. ;         3 - Network IP.   
  98. ;         4 - Internet IP.   
  99. ; Eg:   
  100. ; Push '192.168.0.100'
  101. ; Call CheckIP   
  102. ; Pop $0 ; Contains '3'
  103. ; Pop $1 ; Contains '192.168.0.100'
  104. Function CheckIP   
  105.   Exch $0
  106.   Push $1
  107.   ; Check 127.x.x.x   
  108.   Push '127.0.0.0'
  109.   Push $0
  110.   Call VersionCheck   
  111.   Pop $1
  112.   StrCmp $12'' Range1     ; IP cannot be in range of LoopBack addresses   
  113.   Push '127.255.255.255'
  114.   Push $0
  115.   Call VersionCheck   
  116.   Pop $1
  117.   StrCmp $11 LoopBack      ; We found a LoopBack IP   
  118.   ; Check 10.x.x.x   
  119.   Range1:   
  120.   Push '10.0.0.0'
  121.   Push $0
  122.   Call VersionCheck   
  123.   Pop $1
  124.   StrCmp $12'' Range2     ; IP cannot be in range 1
  125.   Push '10.255.255.255'
  126.   Push $0
  127.   Call VersionCheck   
  128.   Pop $1
  129.   StrCmp $11 LanIp         ; We found a LanIp   
  130.   ; Check 172.16.x.x to 172.31.x.x   
  131.   Range2:   
  132.   Push '172.16.0.0'
  133.   Push $0
  134.   Call VersionCheck   
  135.   Pop $1
  136.   StrCmp $12'' Range3     ; IP cannot be in range 2
  137.   Push '172.31.255.255'
  138.   Push $0
  139.   Call VersionCheck   
  140.   Pop $1
  141.   StrCmp $11 LanIp         ; We found a LanIp   
  142.   ; Check 192.168.x.x   
  143.   Range3:   
  144.   Push '192.168.0.0'
  145.   Push $0
  146.   Call VersionCheck   
  147.   Pop $1
  148.   StrCmp $12'' Range4     ; IP cannot be in range 3
  149.   Push '192.168.255.255'
  150.   Push $0
  151.   Call VersionCheck   
  152.   Pop $1
  153.   StrCmp $11 LanIp         ; We found a LanIp   
  154.   ; Check 169.254.x.x   
  155.   Range4:   
  156.   Push '169.254.0.0'
  157.   Push $0
  158.   Call VersionCheck   
  159.   Pop $1
  160.   StrCmp $12'' InternetIp ; It should be an internet IP   
  161.   Push '169.254.255.255'
  162.   Push $0
  163.   Call VersionCheck   
  164.   Pop $1
  165.   StrCmp $11 APA           ; We found an Automatic Private IP Address   
  166.   Goto InternetIp           ; Remaining addresses are internet IPs   
  167.   LoopBack:   
  168.   StrCpy $11
  169.   Goto Exit   
  170.   APA:   
  171.   StrCpy $12
  172.   Goto Exit   
  173.   LanIp:   
  174.   StrCpy $13
  175.   Goto Exit   
  176.   InternetIp:   
  177.   StrCpy $14
  178.   Exit:   
  179.   Exch $1
  180.   Exch 1
  181.   Exch $0
  182.   Exch 1
  183. FunctionEnd   
  184. ; Function VersionCheck   
  185. ; input: 'v1''v2' on stack   
  186. ; output 1 - if number 1 is newer   
  187. ;        2 - if number 2 is newer   
  188. ;        0 - if it is the same verion   
  189. ; Eg:   
  190. ; Push '3.5.1.4'
  191. ; Push '3.5'
  192. ; Call VersionCheck   
  193. ; Pop $0 ; now contains 1
  194. Function VersionCheck   
  195.   Exch $0 ;second versionnumber   
  196.   Exch   
  197.   Exch $1 ;first versionnumber   
  198.   Push $R0 ;counter for $0
  199.   Push $R1 ;counter for $1
  200.   Push $3 ;temp char   
  201.   Push $4 ;temp string for $0
  202.   Push $5 ;temp string for $1
  203.   StrCpy $R0 "-1"
  204.   StrCpy $R1 "-1"
  205.   Start:   
  206.   StrCpy $4""
  207.   DotLoop0:   
  208.   IntOp $R0 $R0 + 1
  209.   StrCpy $3 $01 $R0   
  210.   StrCmp $3"" DotFound0   
  211.   StrCmp $3"." DotFound0   
  212.   StrCpy $4 $4$3
  213.   Goto DotLoop0   
  214.   DotFound0:   
  215.   StrCpy $5""
  216.   DotLoop1:   
  217.   IntOp $R1 $R1 + 1
  218.   StrCpy $3 $11 $R1   
  219.   StrCmp $3"" DotFound1   
  220.   StrCmp $3"." DotFound1   
  221.   StrCpy $5 $5$3
  222.   Goto DotLoop1   
  223.   DotFound1:   
  224.   Strcmp $4""0 Not4   
  225.     StrCmp $5"" Equal   
  226.     Goto Ver2Less   
  227.   Not4:   
  228.   StrCmp $5"" Ver2More   
  229.   IntCmp $4 $5 Start Ver2Less Ver2More   
  230.   Equal:   
  231.   StrCpy $0"0"
  232.   Goto Finish   
  233.   Ver2Less:   
  234.   StrCpy $0"1"
  235.   Goto Finish   
  236.   Ver2More:   
  237.   StrCpy $0"2"
  238.   Finish:   
  239.   Pop $5
  240.   Pop $4
  241.   Pop $3
  242.   Pop $R1   
  243.   Pop $R0   
  244.   Pop $1
  245.   Exch $0
  246. FunctionEnd  

執行上面這個例子你就可以看到結果了。

IP地址獲取之後,寫入配置檔案就簡單了。如果是ini檔案,可以直接用WriteINIStr方法

指令 <noscript src="/admin/blogs/339618/chmlink.js" type="text/javascript"></noscript>

WriteINIStr $TEMP/something.ini section1 something 123
WriteINIStr $TEMP/something.ini section1 somethingelse 1234
WriteINIStr $TEMP/something.ini section2 nsis true