2013-01-08 84 views
0

我是nsis安裝程序的新手。我想檢測用戶的國家(通過IP),然後取決於國家想要採取一些行動。我在nsis插件目錄中搜索,但我發現只有一個插件來檢測IP。NSIS通過IP檢測國家代碼

如何通過ip在nsis中獲取國家代碼? 謝謝

+0

拆開NSIS,你怎麼看?你是否正在尋找當前主機TLD的國家代碼(以及.com,.edu或.org?),還是在計算在某種目錄中查找IP?那麼在NAT後面的本地不可路由地址如何呢?你會尋找公共外部IP? – Seki

+0

@Seki希望從用戶使用的IP獲取國家代碼。例如,如果位於美國的用戶ip我將得到美國的國家代碼。如果位於英國的用戶,我會得到代碼GB。沒有必要獲得國家代碼。只有國家夠了 –

回答

3

從IP檢測的國家意味着你需要:

  1. 互聯網連接
  2. 一種方法來確定外部IP(不包括代理?)
  3. 訪問IP /地理位置數據庫

爲什麼不在本地機器上使用Windows配置:

!include LogicLib.nsh 
!define LOCALE_SCOUNTRY 6 ; Localized 
!define LOCALE_SENGCOUNTRY 4098 
!define LOCALE_SENGLANGUAGE 0x00001001 
!define GEOCLASS_NATION 16 
!define GEOID_NOT_AVAILABLE -1 
!define GEO_ISO2 4 
!define GEO_ISO3 5 


Section 

System::Call 'KERNEL32::GetUserDefaultLangID()i.r0' 
DetailPrint LANGID=$0 
System::Call 'KERNEL32::GetLocaleInfo(i$0,i${LOCALE_SENGCOUNTRY},t.r1,i1000)' 
DetailPrint LOCALE_SENGCOUNTRY=$1 
System::Call 'KERNEL32::GetLocaleInfo(i$0,i${LOCALE_SCOUNTRY},t.r1,i1000)' 
DetailPrint LOCALE_SCOUNTRY=$1 
System::Call 'KERNEL32::GetLocaleInfo(i$0,i${LOCALE_SENGLANGUAGE},t.r1,i1000)' 
DetailPrint LOCALE_SENGLANGUAGE=$1 

System::Call 'KERNEL32::GetUserGeoID(i${GEOCLASS_NATION})i.r0' 
DetailPrint GEOID=$0 
${If} $0 <> ${GEOID_NOT_AVAILABLE} ; Only available if the user has set a country/location 
${AndIf} $0 != "error" ; GetUserGeoID is WinXP+ 
    System::Call 'KERNEL32::GetGeoInfo(i$0,i${GEO_ISO2},t.r1,i1000,i0)' 
    DetailPrint GEO_ISO2=$1 
    System::Call 'KERNEL32::GetGeoInfo(i$0,i${GEO_ISO3},t.r1,i1000,i0)' 
    DetailPrint GEO_ISO3=$1 
${EndIf} 

SectionEnd