0

我是 nsis 安装程序的新手。我想检测用户的国家(通过 ip),然后根据国家想要做一些动作。我在 nsis plugins 目录中搜索,但只找到了一个检测 ip 的插件。

如何通过 ip in nsis 获取国家代码?谢谢

4

1 回答 1

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
于 2013-01-09T18:23:32.697 回答