2012-08-13 81 views
1

我正在查詢地理數據庫(城市,國家,組織)的一堆IP地址。 我看着http://www.maxmind.com/download/geoip/api/pascal/Sample.pas和修改了它:德爾菲Maxmind geoip查詢

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; 

,但我得到超過50000查詢沒有結果。 我知道在使用csv時必須處理地址,但我有二進制db版本。 我錯過了什麼?

謝謝!

+0

什麼返回你'GeoIP.GetDatabaseInfo'? – TLama 2012-08-13 13:36:43

+0

不幸的是:http://s13.postimage.org/r0ihjezev/geoipdbinfo.png – asg2012 2012-08-13 13:42:35

+0

而且你有德爾福2009+和使用['a unit'](http://www.maxmind.com/download/geoip/api /pascal/GeoIP.pas)是在Delphi版本之前創建的。所以它看起來像是ANSI/Unicode不匹配。 – TLama 2012-08-13 13:45:46

回答

4

您遇到了衆所周知的ANSI/Unicode不匹配問題。您使用的是Delphi版本(版本2009+)和the unit的Unicode版本,它是在Delphi版本的Delphi發佈之前發佈的。

在2009年以下的德爾福(非Unicode)類型如stringPChar映射到這些類型的ANSI版本,而從Delphi 2009到Unicode的類型。

1質量取代:

爲了解決這個問題GeoIP.pas單元,作爲第一,替換的所有出現:

PChar -> PAnsiChar 
string -> AnsiString 

2.微小變化:

完成替換後,請更改AnsiString型線93回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; 
+0

是的,這使得伎倆 – asg2012 2012-08-13 14:06:58

+1

沒有*所有*發生。例如,對'inet_addr'的調用不應該改變,並且在任何*情況下可能不需要將'string'改爲'AnsiString'。 – 2012-08-13 15:34:37

+0

@Rob,是的,沒錯。除了'inet_addr'外,所有的方法參數都不需要改變。隨意發佈您的答案...我會刪除這一個。但是恐怕如果不發佈新版本的單元,這種描述就不那麼容易了。 – TLama 2012-08-13 15:39:23