利用C++Builder实现Google的Web服务 (转)

http://blog.csdn.net/guanwen_zhang/archive/2007/11/04/1866346.aspx

Web
服务是一个额外的接口,这个接口由某个网站提供,可以被其他的网站调用。
你可以把web服务想象成一个自我包含的组件,同时带有一种或多种的调用方法。他
可以驻扎在Inetnet的任何地方。通过他所提供的调用方法而被世界任何一个地方的客户
端所调用。
Google提供了一个Web服务让你可以使用他的数据库去搜索,方便的实现对网页的搜索。
Google的Web服务主要提供三个方法:
 
doGoogleSearch(), doGetCachedPage(), 和 doSpellingSuggestion().
最常用的就是doGoogleSearch(),方法将返回和查询字符相符合的结果。
然后这个方法返回一个GoogleSearchResult类的实例,这个实例中包含了搜索的结果。
实现Google的Web服务需要获得Google提供的许可证,现在这个许可证也不再发放,但可以在网上搜索到。
下面就详细介绍利用C++Builder实现对Google服务的使用:
首先新建一个工程,保存为WebService.bpr,保存Cpp文件为MainUnit.cpp,
再在File|New|Other...中选择WebServces页面,选择WSDL Importer,点击OK,
出现WSDL Importer Wizard向导,在Location of WSDL File or URL中填入Google的Web服务
接口的URL:http://api.google.com/GoogleSearch.wsdl,点击Next,Finish完成配置过程,此时
C++Builder会自动生成Google服务的WSDL的描述文件,
在窗口中添加一个Button、Label、Edit和CppWebBrowser,
双击Button,在其中添加如下代码:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    AnsiString content;
    IHTMLElement   *body;
    IHTMLDocument   *document;
    GoogleSearchResult *result;
    _di_GoogleSearchPort search;
    AnsiString quer = Edit1->Text;
    if (quer == "")
    {
        ShowMessage("查询内容为空!");
        return ;
    }
    search = GetGoogleSearchPort(true, "http://api.google.com/GoogleSearch.wsdl");
    try
    {
        result = search->doGoogleSearch("tGCTJkYos3YItLYzI9Hg5quBRY8bGqiM", quer, 0, 10, false, "", false, "", "", "");
    }
    catch(Exception &exception)
    {
       ShowMessage("网络有故障!");
    }
    for (int i=0; i<10; i++)
    {
        AnsiString title  = result->resultElements[i]->title;
        AnsiString URL = result->resultElements[i]->URL;
        AnsiString text = result->resultElements[i]->snippet;
        content += "<a href=" + URL + " target=_blank>" + title + "</a><br>" + text + "<br><br>";
    }
    CppWebBrowser1->Navigate(L"about:blank");
    AnsiString str = "<html>" + content +" </html>";
    SetHtml(CppWebBrowser1, str);
}
//---------------------------------------------------------------------------

SetHtml的实现函数如下:

void __fastcall TForm1::SetHtml( TCppWebBrowser *WebBrowser,AnsiString Html )
{
    IStream *Stream;
    HGLOBAL hHTMLText;
    IPersistStreamInit *psi;

    if( WebBrowser->Document == NULL )
        return;
    hHTMLText = GlobalAlloc(GPTR, Html.Length() + 1 );
    if(0== hHTMLText ) {
        ShowMessage( "GlobalAlloc Error" );
        return;
    }

    CopyMemory( hHTMLText, Html.c_str(), Html.Length() );

    OleCheck( CreateStreamOnHGlobal( hHTMLText, true, &Stream ) );

    try {
        OleCheck( WebBrowser->Document->QueryInterface( __uuidof(IPersistStreamInit), (void **)&psi ) );
        try {
            OleCheck( psi->InitNew() );
            OleCheck( psi->Load(Stream) );
        } catch( ... ) {
            psi->Release();
        }
    } catch( ... ) {
        Stream->Release();
    }
    //delete psi;
    psi->Release();
//    delete Stream;
    Stream->Release();
}

还需要在头文件中添加#include   "mshtml.h"文件,
编译连接,生成可执行文件。
在Edit中添加要搜索的内容,点击Button,即可执行,
如果需要其他属性,还可以在result->resultElements[i]选择搜索结果的其他属性最后显示出来。
搜索结果最后显示在ppWebBrowser中,由于发送XML文件、解析XML文件的过程,显示过程会有一定的时间间隔,需要耐心等待。
posted @ 2007-11-15 14:56  jambol  阅读(565)  评论(0编辑  收藏  举报