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で作業するときにアドレスを操作する必要があることは知っていますが、バイナリdbバージョンがあります。私は何が欠けていますか?

ありがとう!

4

1 に答える 1

6

よく知られた ANSI/Unicode の不一致の問題が発生しました。Delphi の Unicode バージョン(バージョン 2009 以降)を使用しthe unitており、Delphi の Unicode バージョンがリリースされる前の日付です。

2009年以前のDelphi(非Unicode)では、これらの型のANSIバージョンに似たstring、またはPCharマッピングされた型でしたが、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 に答える