Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для ganselo

Старожил


Сообщения: 232
Благодарности: 90

Профиль | Сайт | Отправить PM | Цитировать


HTTPQuery это TIdHTTP *HTTPQuery. Кидаете на форму TIdHTTP и переименовываете его на HTTPQuery.
Я использую Borland C++ Builder 2006 с установленной поверх Indy 2010.

Попробуйте создать пустой проект и на форму перетащите следующее:
TMemo, TButton, TIdHTTP и переименуйте их в Memo, Button, HTTPQuery соответственно. Далее добавьте в проект *.cpp файлы из папки TinyXML. Подключите хидеры:
Код: Выделить весь код
#include "tinyxml/tinystr.h"
#include "tinyxml/tinyxml.h"
В обработчике события OnClick класса Button впишите следующее:
Код: Выделить весь код
AnsiString md5Hesh = "d8578edf8458ce06fbc5bb76a58c5ca4";
    TStringList *post = new TStringList;
    TStringStream *response = new TStringStream("");

    post->Add("chain=" + md5Hesh);

    try
    {
        HTTPQuery->Post("http://www.virustotal.com/search.html", post, response);
    }
    catch(EIdSocketError &se)
    {
        ShowMessage(se.Message);
    }
    catch(EIdHTTPProtocolException &se)
    {

    }
    catch(Exception &e)
    {
        ShowMessage(e.Message);
    }
    ShowMessage(response->DataString);

    delete HTTPQuery, post, response;
Далее вставьте следующий код:
Код: Выделить весь код
//---------------------------------------------------------------------------
const char * getIndent( unsigned int numIndents )
{
	static const char * pINDENT="                                      + ";
	static const unsigned int LENGTH=strlen( pINDENT );
	unsigned int n=numIndents*NUM_INDENTS_PER_SPACE;
	if ( n > LENGTH ) n = LENGTH;

	return &pINDENT[ LENGTH-n ];
}
//---------------------------------------------------------------------------
int dump_attribs_to_stdout(TiXmlElement* pElement, unsigned int indent, TIdent &ident)
{
	if ( !pElement ) return 0;

	TiXmlAttribute* pAttrib=pElement->FirstAttribute();
	int i=0;
	int ival;
	double dval;
	const char* pIndent=getIndent(indent);
	while (pAttrib)
	{
        ident.insert(make_pair(pAttrib->Name(), pAttrib->Value()));
		i++;
		pAttrib=pAttrib->Next();
	}
	return i;	
}
//---------------------------------------------------------------------------
void __fastcall dump_xml(TiXmlNode *pParent, TListRes &lst, unsigned int indent = 0)
{
    if(!pParent) return;

    TiXmlNode* pChild;
	int t = pParent->Type();
	static TIdent ident;
    static bool flag = false;

	switch (t)
	{
	    case TiXmlNode::TINYXML_ELEMENT:
        {
            AnsiString val = pParent->Value();
            if(val == "table")
            {
                dump_attribs_to_stdout(pParent->ToElement(), indent+1, ident);

                if(ident["id"] == "tablaMotores") flag = true;
                ident.clear();
            }
            else
            {
                if(flag && (val != "th" && val != "tr" && val != "td"))
                {
                    flag = false;
                    return;
                }
            }
        }
    	break;
	    case TiXmlNode::TINYXML_TEXT:
            if(flag)
            {
                lst.push_back(pParent->Value());
            }
		break;
	default:
		break;
	}
	for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling())
        dump_xml(pChild, lst, indent + 1);
}
//----------------------------------------------------------------------------
void __fastcall ParseXml(const AnsiString &xml, TResult &result)
{
    TListRes lst;
    RESULT_NODE res_node;
    int count;
    TiXmlDocument xml_doc;
    xml_doc.Parse(xml.c_str(), 0, TIXML_ENCODING_UTF8);
    dump_xml(&xml_doc, lst);

    for(int i = 4; i < lst.size(); i+=4)
    {
        res_node.antivirus = lst[i];
        res_node.version = lst[i + 1];
        res_node.last_upd = lst[i + 2];
        res_node.result = lst[i + 3];
        result.push_back(res_node);
    }
}
Далее в обработчике события OnRedirect класса HTTPQuery добавьте следующее:
Код: Выделить весь код
void __fastcall TForm1::HTTPQueryRedirect(TObject *Sender,
      AnsiString &dest, int &NumRedirect, bool &Handled,
      AnsiString &VMethod)
{
    TResult result;
    AnsiString res = HTTPQuery->Get(dest);
    Memo->Lines->Add(res);
    ParseXml(res, result);
    Handled = false;
    bool flag = true;

    for(TResult::iterator i = result.begin(); i != result.end(); i++)
    {
        if(i->result != "-")
        {
            Application->MessageBoxA(
                AnsiString("Обнаружен вирус " + i->result).c_str(), "Внимание",
                MB_OK + MB_ICONWARNING);
            flag = false;
        }
    }
    if(flag) Application->MessageBoxA("Вирусов не обнаружено", "Информация",
                MB_OK + MB_ICONINFORMATION);
}
В файле, где объявлена главная форма (Unit1.h) вставьте слежующее:
Код: Выделить весь код
#include <list>
#include <map>
#include <vector>
using namespace std;

struct RESULT_NODE
{
    AnsiString antivirus;
    AnsiString version;
    AnsiString last_upd;
    AnsiString result;
};
typedef map<AnsiString, AnsiString> TIdent;
typedef vector<AnsiString> TListRes;
typedef list<RESULT_NODE> TResult;
Попробуйте скомпилировать.

-------
К величайшему сожалению "история учит нас тому, что она ничему не учит".

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:33, 19-08-2010 | #14