便便's profile可爱的便便PhotosBlogLists Tools Help

Blog


    3/11/2006

    [软件] 网页IP转换工具 Lily Ip Search

    Lily Ip Search

    ====================================================
    v2.00             ReadMe            Powered by Net
    ====================================================

    将网页上的ip地址转为物理地址。

    安装后,重新打开浏览器。

    在网页中点击右键,选择“转换页面所有IP地址”:
    http://lilybbs.net/file/N/NetGG/LilyIpSearch.gif

    原图:
    http://lilybbs.net/file/N/NetGG/LilyIpSearch1.gif
    转换后:
    http://lilybbs.net/file/N/NetGG/LilyIpSearch2.gif

    下载:
    http://www.onlinedown.net/soft/47715.htm
    7/31/2005

    [郁闷] 装控件装死我了

    为了编译那个“胜天进销存 (源代码)”,安装下列控件:
    需要安装的控件包
      DevExQuantumGrid v3.22 Pro for D6,D7 表格控件
      ExpressBars v4.2 (工具条控件)
      RX Library 2.75 D7 (控件包)
      ExpressQuantumGrid Suite v 4.2 表格控件
      SkinEngine v3.4.7 (皮肤界面控件包)
    需要编译的控件包(不需要安装)
      InfoPower 4000.0.3 (数据库控件包)
      Report Machine 2.6 报表控件包
      TsncCurrency 货币编辑控件 V1.1
      vclzip2.23
    需要安装的微软的
      MSAGENT.EXE
    比较麻烦的
      ehlib3
     
    哎哟,装死我了,装了一下午。那个 ExpressQuantumGrid Suite v 4.2 尤其恶心,一装会把原来Delphi里的搜索路径清空,气死我了。(后来看人家的评论,这个可以不用装)
     
    后来越来越郁闷,又碰到Express系列的到处不兼容。心一横,把所有都卸了,再把Delphi卸了,嘿嘿。重来一遍,而且上面说什么版本就什么版本(原来尽量升级到新一点的版本,因为以我自己的经历,旧版本有好多bug),那个郁闷啊。
     
    装完,路径加好,编译,P4 2.8G 512M的编译了一分钟,一大堆Warning,还好没有Fatal error。唉,总算是成功了。
    运行,Win2000系统报错:“Cannot find procedure starting adress GetGlobalBabyJITEnabled in DLL-file
    CLBCatQ.DLL”。好像是系统的问题,因为我运行了一下原来可以的程序,也有这个错误。可能是连ACCESS数据库的问题。不管了,反正程序没大问题。
     
    最后,鄙视用那么多控件的程序。。。。我靠。。。。
    7/29/2005

    [更新] 百合IP搜索 Lily Ip Search v2.0

     v2.00             ReadMe            Powered by Net
    ====================================================
    IP搜索在本程序内完成,不再调用珊蝴虫QQ的dll
    点击地址后IP信息复制到剪贴板
    解决旧版本在XP等系统上不能正常工作的bug
    解决旧版本再次调用出现乱码的bug
    制作安装文件,方便安装/卸载
     

    [呵呵] ipsearch的问题

    v1.00版本用的是QQ外挂的ipsearcher.dll,不过好像在xp系统里面COM调用出问题:值不能传给JavaScript。
    后来没办法,只好自己写查询ip了。
    网上找了php的、c#的查询QQWry.Dat的代码,想改成Delphi的,后来发现也有Delphi的代码,就拿来改了改,试了试,发现这样调用是没有问题的。
    于是,想当然的把MyIP.dat也当成QQWry.Dat的格式来查找,发现报错(不过一直没怀疑到这点上来,好笨笨)。呵呵,后来发现格式是不一样的。
    发信给MyIP.dat的作者问格式,好像没在上网。
    呵呵,自己先用UltraEdit打开看看MyIP.dat,格式比QQWry.Dat简单多了。大概是这样的:
    文件头:0000h - 00c1h(偏移194)
    下面是数据记录,每个记录占用106长度:起始ip占用16,结束ip占用16,国家占用14,地区占用47,感谢人占用13
    好像查找是按照记录从头到脚查的。
    用Delphi描述每个记录:
      TMyIPRecord = record
        startIP: string[16];
        endIP: string[16];
        country: string[14];
        area: string[47];
        thank: string[13];
      end;
    不知道对不对,暂时这样写着。作者实在联系不到就这样试试吧。
     
    晚上自己试出来了,下面贴出unit:
    {===============================================================================
    TMyIP
     Class with MyIP.dat - by bianbian (yuelinniao#hotmail.com)
       Status:  Freeware
     Compiler:  Delphi4, Delphi5, Delphi6, Delphi7
      Version:  1.0
     Lastdate:  2005-07-29
          Url:  http://spaces.msn.com/members/yuelinniao
       在此unit中,实现了对于QQ自定义IP数据库(MyIP.dat)的IP数据库的检索
    ===============================================================================}
    unit untMyIP;
    interface
    uses
      SysUtils, Classes, Math, dialogs;
    const
      _header = 193; //文件头偏移
      _startIP = 16; //开始ip的长度
      _endIP = 16;   //结束ip的长度
      _country = 14; //国家的长度
      _area = 47;    //地区的长度
      _thank = 13;   //感谢人的长度
    type
      TMyIP = class(TObject)
        public
          constructor Create(cQQWryFileName: string);
          destructor Destroy; override;
          function GetIPAddress(IP: string): string;
        protected
          function GetIPValue(IP: string): Cardinal;
        private
          MyIPFileStream: TFileStream;
      end;
    implementation
    constructor TMyIP.Create(cQQWryFileName: string);
    begin
      inherited Create;
      MyIPFileStream:=TFileStream.Create(cQQWryFileName, fmOpenRead or fmShareDenyWrite, 0);
    end;
    destructor TMyIP.Destroy;
    begin
      MyIPFileStream.Free;
      inherited Destroy;
    end;

    ///**
    //* 给定一个IP地址,返回该项记录的信息
    //* @param  IP  IP地址 string
    //* @return 国家信息+地区信息  string
    //*/
    function TMyIP.GetIPAddress(IP: string): string;
      function SearchAddress(IPRecordFrom, IPValue: Cardinal): string;
      var
        strStartIP: string[_startIP];
        strEndIP: string[_endIP];
        CompareIPValue1, CompareIPValue2: Cardinal;
        strCountry: string[_country];
        strArea: string[_area];
      begin
        Result := '';
        MyIPFileStream.Seek(IPRecordFrom, soFromBeginning);
        MyIPFileStream.Read(strStartIP, _startIP);
        MyIPFileStream.Read(strEndIP, _endIP);
        try
          strStartIP[_startIP] := Chr(0);
          strEndIP[_endIP] := Chr(0);
        except
        end;
        CompareIPValue1 := GetIPValue(strStartIP);
        CompareIPValue2 := GetIPValue(strEndIP);
        //找到了
        if (IPValue >= CompareIPValue1) and (IPValue <= CompareIPValue2) then
        begin
          MyIPFileStream.Read(strCountry, _country);
          MyIPFileStream.Read(strArea, _area);
          Result := strArea; //这里只返回区域
        end
        else if (IPValue > CompareIPValue2) then //比大的还要大,查下一个
        begin
          IPRecordFrom := MyIPFileStream.Position + _country + _area + _thank;
          Result := SearchAddress(IPRecordFrom, IPValue);
        end;
      end;
    begin
      Result := SearchAddress(_header, GetIPValue(IP));
    end;
    ///**
    //* 给定一个IP地址(四段点分字符串形式),返回该IP的数值
    //* @param  IP  IP地址(四段点分字符串形式)  string
    //* @return 该IP的数值  Cardinal
    //*/
    function TMyIP.GetIPValue(IP: string): Cardinal;
    var
      tsIP: TStringlist;
      i: integer;
      function SplitStringToStringlist(aString: string; aSplitChar: string): TStringlist;
      begin
        Result:=TStringList.Create;
        while pos(aSplitChar, aString)>0 do begin
          Result.Add(copy(aString, 1, pos(aSplitChar, aString)-1));
          aString:=copy(aString, pos(aSplitChar, aString)+1, length(aString)-pos(aSplitChar, aString));
        end;
        Result.Add(aString);
      end;
    begin
      tsIP:=SplitStringToStringlist(IP, '.');
      Result:=0;
      for i:=3 downto 0 do
      begin
          Result:=Result + StrToInt(tsIP[i]) * trunc(power(256, 3-i));
      end;
    end;
    end.
    7/28/2005

    [原创] 百合IP搜索 Lily Ip Search v1.00

     百合IP搜索 Lily Ip Search v1.00             ReadMe
    ====================================================
                                         Powered by Net

    将网页上的ip地址转为物理地址。

    运行RegLilyIpSearch.exe安装和卸载。

    在网页中点击右键,选择“转换页面所有IP地址”:
    http://bbs.nju.edu.cn/file/N/NetGG/LilyIpSearch1.gif

    效果图:
    http://bbs.nju.edu.cn/file/N/NetGG/LilyIpSearch2.gif

    v1.0下载已经不可用,请下v2.0
    5/24/2005

    [原来] 原来连个Postgres这么麻烦

    要装BDE,psqlodbc。

    呵呵,今天客户那里没有BDE,我机器上因为装了Delphi,有BDE。

    客户装了ODBC后连不上数据库,连不上数据库就不能批量导数据(总不能天天让欧干这种活吧)。

    呵呵。后来装了BDE就搞定了。

    [牢骚] 我靠。。。。我就服了TTable

    晚上用Delphi把Excel的数据导入到Postgres数据库里(领导说客户明天就要用,sign)。

    怎么都提示找不到字段。

    于是改字段、加字段、移字段。。。。。还是失败。

    于是重启数据库、重新删了配置ODBC,重新。。。。。还是失败。

    我靠,后来发现Delphi的TTable(访问数据库表的控件)里面居然要事先指定Table的所有字段名。

    我靠,没见过这么白痴的控件。我就服了!

    害我和项目经理搞到现在。。。。。。。。。5555555555。。。。。。。。

    TTable啊,你不会是我的仇家派来故意玩我的吧~