3

我正在查询 geoip 数据库(城市、国家、组织)以获取一堆 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 时必须操纵地址,但我有二进制数据库版本。我错过了什么?

谢谢!

4

1 回答 1

6

您遇到了众所周知的 ANSI/Unicode 不匹配问题。您使用的是 Unicode 版本的 Delphi(2009+ 版),the unit并且日期早于 Unicode 版本的 Delphi 发布。

在 Delphi 2009 以下(非 Unicode)中,类型类似于stringPChar映射到这些类型的 ANSI 版本,而自 Delphi 2009 到 Unicode 版本。

1.批量更换:

要修复这个GeoIP.pas单元,首先,替换所有出现的:

 PChar  -> PAnsiChar
 string -> AnsiString

2.小​​改动:

完成替换后,将第AnsiString93 行的类型更改回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;
于 2012-08-13T13:53:11.257 回答