【问题标题】:Maxmind geoip query in delphiDelphi中的Maxmind geoip查询
【发布时间】:2012-08-13 13:30:03
【问题描述】:

我正在查询 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 时必须操纵地址,但我有二进制数据库版本。 我错过了什么?

谢谢!

【问题讨论】:

  • GeoIP.GetDatabaseInfo 的回报是什么?
  • 不幸的是胡言乱语:s13.postimage.org/r0ihjezev/geoipdbinfo.png
  • 您拥有 Delphi 2009+ 并使用在您的 Delphi 版本之前创建的 a unit。所以看起来像是 ANSI/Unicode 不匹配。
  • @user582118,你在哪里找到GeoIPAPI.pas?我从问题中的链接通过存储库browsed,但没有GeoIPAPI.pas...
  • @user582118 Pchar 是最痛苦的事情,但我认为他也应该将 Char 更改为 AnsiChar 并将 String 更改为 AnsiString。例如,如果他要使用 var_string[10] 或更糟糕的 @var_string[10]

标签: delphi geoip


【解决方案1】:

您遇到了众所周知的 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;

【讨论】:

  • 没有所有次出现。例如,对inet_addr 的调用不应更改,并且在任何 种情况下都可能不需要将string 更改为AnsiString。
  • @Rob,是的,没错;除了inet_addr,所有方法参数都不需要更改。随意张贴你的答案...我会删除这个。但是,如果不发布该单元的新版本,恐怕就不会那么容易描述了。
  • @Rob,现在再看一遍,inet_add 必须更改,因为它被定义为char*,所以PAnsiChar 在这里是正确的。 IPAddr 字符串参数也应该保留在它们的 ANSI 版本中,因为它们只是传递给方法内部的 inet_add 函数。因此,在 mass 替换之后唯一要更改的是 TGeoIP.Create 构造函数,其中 FileName 参数用于创建文件流。
  • 如果 inet_addr 需要 PAnsiChar,那么原始的、未更改的代码一开始就不会编译。但我们已经知道它确实编译了,因为程序运行了,所以它必须接受 PChar。
  • @Rob,那么 OP 必须进行某种只是为了编译盲修改,因为如果没有 Unicode Delphi 上的更改,它实际上无法编译。刚刚验证...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 2012-07-27
  • 1970-01-01
  • 2012-01-09
  • 2018-10-14
  • 2015-11-28
相关资源
最近更新 更多