HTTPQuery это TIdHTTP *HTTPQuery. Кидаете на форму TIdHTTP и переименовываете его на HTTPQuery.
Я использую Borland C++ Builder 2006 с установленной поверх Indy 2010.
Попробуйте создать пустой проект и на форму перетащите следующее:
TMemo, TButton, TIdHTTP и переименуйте их в Memo, Button, HTTPQuery соответственно. Далее добавьте в проект *.cpp файлы из папки TinyXML. Подключите хидеры:
Код:
![Выделить весь код](images/misc/selectcode.png)
#include "tinyxml/tinystr.h"
#include "tinyxml/tinyxml.h"
В обработчике события OnClick класса Button впишите следующее:
Код:
![Выделить весь код](images/misc/selectcode.png)
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;
Далее вставьте следующий код:
Код:
![Выделить весь код](images/misc/selectcode.png)
//---------------------------------------------------------------------------
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 добавьте следующее:
Код:
![Выделить весь код](images/misc/selectcode.png)
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) вставьте слежующее:
Код:
![Выделить весь код](images/misc/selectcode.png)
#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;
Попробуйте скомпилировать.