我正在寻找geoip数据库(city,country,org)查询一堆IP地址。 我查看了http://www.maxmind.com/download/geoip/api/pascal/Sample.pas并对其进行了修改:
function LookupCountry(IPAddr: string) : string;
var
GeoIP: TGeoIP;
GeoIPCountry: TGeoIPCountry;
begin
GeoIP := TGeoIP.Create('C:\Users\Albert\Documents\RAD Studio\Projects\Parser\geoip\GeoIP.dat');
try
if GeoIP.GetCountry(IPAddr, GeoIPCountry) = GEOIP_SUCCESS then
begin
Result := GeoIPCountry.CountryName;
end
else
begin
Result := IPAddr;
end;
finally
GeoIP.Free;
end;
end;
但我在超过50'000个查询中没有得到任何结果。 我知道在使用csv时必须操作地址,但我有二进制db版本。 我错过了什么?
谢谢!
答案 0 :(得分:5)
您遇到了众所周知的ANSI / Unicode不匹配问题。你正在使用Unicode版本的Delphi(版本2009+)和the unit
,它是在发布Unicode版本的Delphi之前的日期。
在2009年以下的Delphi(非Unicode)中,类似string
或PChar
的类型映射到这些类型的ANSI版本,而从Delphi 2009到Unicode版本。
的 1。质量替换:
要修复此GeoIP.pas
单元,请首先替换所有出现的情况:
PChar -> PAnsiChar
string -> AnsiString
的 2。小改动:
完成替换后,将第93行的AnsiString
类型更改回string
类型:
92 public
93 constructor Create(const FileName: AnsiString); // <- string
94 ...
第138行也是如此:
138 constructor TGeoIP.Create(const FileName: AnsiString); // <- string
139 begin
140 inherited Create;