⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 umain.cpp

📁 读取QQ IP数据库(QQWry.dat)文件格式
💻 CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "uMain.h"
#include "uClass.h"
#include "uAbout.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmMain *frmMain;
TQQWry *g_wry;
//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
        : TForm(Owner)
{
    g_wry = NULL;
    FStopFlag = true;
    imgLogo->Picture->Assign(Application->Icon);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormShow(TObject *Sender)
{
    String strAppPath = ExtractFilePath(Application->ExeName);
    if(strAppPath.LastDelimiter("\\") != strAppPath.Length())
        strAppPath += "\\";
    FWryDatFileName = strAppPath + "QQWry.Dat";
    if(!FileExists(FWryDatFileName))
        btnNext->Enabled = false;
    else
    {
        g_wry = new TQQWry(FWryDatFileName);
        edtRecCount->Text = g_wry->GetIPRecordCount();
        edtUpdateDate->Text = g_wry->GetUpdateDate();
        btnNext->Enabled = true;
    }
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormClose(TObject *Sender, TCloseAction &Action)
{
    if(g_wry)
        delete g_wry;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnOpenClick(TObject *Sender)
{
    dlgOpen->InitialDir = ExtractFilePath(Application->ExeName);
    if(dlgOpen->Execute())
    {
        if(g_wry)
        {
            delete g_wry;
            g_wry = NULL;
        }
        try
        {
            FWryDatFileName = dlgOpen->FileName;
            g_wry = new TQQWry(FWryDatFileName);
            edtRecCount->Text = g_wry->GetIPRecordCount();
            edtUpdateDate->Text = g_wry->GetUpdateDate();
            btnNext->Enabled = true;
        }
        catch(...)
        {
            MessageBox(Handle, "打开QQWry.Dat文件出错!\r\n"
                    "可能是文件格式不正确,请使用正确的数据库文件.",
                    Application->Title.c_str(),
                    MB_OK | MB_ICONWARNING);
            btnNext->Enabled = false;
        }
    }
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnCloseClick(TObject *Sender)
{
    Close();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnNextClick(TObject *Sender)
{
    if(!FileExists(FWryDatFileName))
        return;
    switch(pgcMain->ActivePageIndex)
    {
        case 0:
        {
            String strMdbPath = ExtractFilePath(FWryDatFileName);
            if(strMdbPath.LastDelimiter("\\") != strMdbPath.Length())
                strMdbPath += "\\";
            edtMdbFileName->Text = strMdbPath + "ip.mdb";
            pgcMain->ActivePageIndex = 1;
            btnNext->Caption = "转换(&P)";
            break;
        }
        case 1:
        {
            pgcMain->ActivePageIndex = 2;
            if(btnNext->Caption == "转换(&P)")
            {
                btnNext->Caption = "停止(&S)";
                FStopFlag = false;
                FMdbFileName = edtMdbFileName->Text;
                TResourceStream *rs;
                bool bTwoFields = chkTwoFields->Checked;
                rs = new TResourceStream((int)HInstance,
                        bTwoFields? "IPMDB2": "IPMDB1", RT_RCDATA);
                try
                {
                    rs->SaveToFile(FMdbFileName);
                }
                catch(...)
                {
                    MessageBox(Handle, ("写入.mdb数据库时失败,请查看\r\n"
                            + FMdbFileName
                            + "\r\n是否正在使用中,或者手动删除这个文件再试试。").c_str(),
                            Application->Title.c_str(), MB_OK | MB_ICONERROR);
                    return;
                }
                con->ConnectionString = String("Provider=Microsoft.Jet.OLEDB.4.0;")
                    + "Data Source=" + FMdbFileName + ";Persist Security Info=False";
                tbl->TableName = "address";
                tbl->Active = true;
                String strStartIP, strEndIP, strCountry, strCity;
                DWORD dwStartTick = GetTickCount();
                DWORD dwRecCount = g_wry->GetIPRecordCount();
                if(bTwoFields) // 两个字段的库
                {
                    for(DWORD i=1; i<dwRecCount; i++)
                    {
                        if(FStopFlag)
                            break;
                        lblProcess->Caption = "处理进度: " + String(i)
                                + String("/") + String(dwRecCount);                            
                        Application->ProcessMessages();

                        String strMsg = g_wry->GetIPMsg(i);
                        strStartIP = strMsg.SubString(1, strMsg.Pos("\r\n") - 1);
                        strMsg = strMsg.SubString(strMsg.Pos("\r\n") + 2, strMsg.Length());
                        strEndIP = strMsg.SubString(1, strMsg.Pos("\r\n") - 1);
                        strMsg = strMsg.SubString(strMsg.Pos("\r\n") + 2, strMsg.Length());
                        if(edtFilter->Text != "" && !strMsg.Pos(edtFilter->Text))
                            continue;
                        strCountry = strMsg.SubString(1, strMsg.Pos("\r\n") - 1);
                        if(strMsg.Pos("\r\n"))
                            strMsg = strMsg.SubString(strMsg.Pos("\r\n") + 2, strMsg.Length());
                        strCity = StringReplace(
                                strMsg, "CZ88.NET", "", TReplaceFlags() << rfReplaceAll);

                        tbl->Insert();
                        tbl->FieldByName("ip1")->AsFloat = g_wry->GetIPValue(strStartIP);
                        tbl->FieldByName("ip2")->AsFloat = g_wry->GetIPValue(strEndIP);
                        tbl->FieldByName("country")->AsString = strCountry;
                        tbl->FieldByName("city")->AsString = strCity;
                        tbl->Post();

                        lblStartIP->Caption = strStartIP;
                        lblEndIP->Caption = strEndIP;
                        lblCountry->Caption = strCountry;
                        pgbConvert->Position = i * 100 / dwRecCount;
                        Application->ProcessMessages();
                    }
                }
                else
                {
                    for(DWORD i=1; i<dwRecCount; i++)
                    {
                        if(FStopFlag)
                            break;
                        lblProcess->Caption = "处理进度: " + String(i)
                                + String("/") + String(dwRecCount);
                        Application->ProcessMessages();

                        String strMsg = g_wry->GetIPMsg(i);
                        strStartIP = strMsg.SubString(1, strMsg.Pos("\r\n") - 1);
                        strMsg = strMsg.SubString(strMsg.Pos("\r\n") + 2, strMsg.Length());
                        strEndIP = strMsg.SubString(1, strMsg.Pos("\r\n") - 1);
                        strMsg = strMsg.SubString(strMsg.Pos("\r\n") + 2, strMsg.Length());
                        if(edtFilter->Text != "" && !strMsg.Pos(edtFilter->Text))
                            continue;
                        strCountry = StringReplace(
                                strMsg, "\r\n", "", TReplaceFlags() << rfReplaceAll);
                        strCountry = StringReplace(
                                strCountry, "CZ88.NET", "", TReplaceFlags() << rfReplaceAll);

                        tbl->Insert();
                        tbl->FieldByName("ip1")->AsFloat = g_wry->GetIPValue(strStartIP);
                        tbl->FieldByName("ip2")->AsFloat = g_wry->GetIPValue(strEndIP);
                        tbl->FieldByName("country")->AsString = strCountry;
                        tbl->Post();

                        lblStartIP->Caption = strStartIP;
                        lblEndIP->Caption = strEndIP;
                        lblCountry->Caption = strCountry;
                        pgbConvert->Position = i * 100 / dwRecCount;
                        Application->ProcessMessages();
                    }
                }
                DWORD dwTickCount = GetTickCount() - dwStartTick;
                tbl->Active = false;
                con->Connected = false;

                WIN32_FIND_DATA FindData;
                FindClose(FindFirstFile(FMdbFileName.c_str(), &FindData));
                lblResult->Caption = FStopFlag?
                        "用户中止操作!": "恭喜! 数据库转换成功!";
                lblFileSize->Caption = String("文件大小: ")
                        + String(FindData.nFileSizeLow / 1024) + " KB";
                lblTickCount->Caption = String("操作用时: ")
                        + String(dwTickCount / 1000) + " 秒";
                lblFileName->Caption = String("文件保存到: ") + FMdbFileName;
                btnNext->Caption = "压缩(&P)";
                pgcMain->ActivePageIndex = 3;
                FStopFlag = true;
            }
            break;
        }
        case 2:
        {
            btnNext->Caption = "转换(&P)";
            FStopFlag = true;
            break;
        }
        case 3:
        {
            WIN32_FIND_DATA FindData;
            FindClose(FindFirstFile(FMdbFileName.c_str(), &FindData));
            String strFileOrigSize = String(FindData.nFileSizeLow / 1024);
            String strResult = CompactMDB(FMdbFileName, "", "")? "成功!": "失败!";
            FindClose(FindFirstFile(FMdbFileName.c_str(), &FindData));
            lblFileSize->Caption = String("文件大小: ")
                    + String(FindData.nFileSizeLow / 1024) + " KB";
            MessageBox(Handle, (String("数据库压缩") + strResult
                    + "\r\n文件原始大小: " + strFileOrigSize + " KB\r\n"
                    + "压缩后大小: "
                    + String(FindData.nFileSizeLow / 1024) + " KB").c_str(),
                    Application->Title.c_str(), MB_OK | MB_ICONINFORMATION);
            btnNext->Visible = false;
            break;
        }
        default:
            break;
    }
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnAboutClick(TObject *Sender)
{
    frmAbout = new TfrmAbout(this);
    frmAbout->ShowModal();
    delete frmAbout; 
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnSelectFileClick(TObject *Sender)
{
    if(dlgSave->Execute())
        edtMdbFileName->Text = dlgSave->FileName;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormCloseQuery(TObject *Sender, bool &CanClose)
{
    if(!FStopFlag)
    {
        if(MessageBox(Handle, "当前正在进行转换操作, 确定要退出程序吗?",
                    Application->Title.c_str(),
                    MB_YESNO | MB_ICONQUESTION) != ID_YES)
            CanClose = false;
        else
        {
            FStopFlag = true;
            Application->ProcessMessages();
        }
    }
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -