Click here to Skip to main content
14,331,729 members

CGoogle: A Google Search class

Rate this:
4.93 (25 votes)
Please Sign up or sign in to vote.
4.93 (25 votes)
8 Dec 2005
A simple class to perform Google searches without the official Google API.


This article provides an easy to use alternative to querying Google via your program through the Google API and SOAP. Many people don't wish to take the time to download the official Google API package and integrate it into their project, so this simple class makes querying Google for search results child's play.

Before You Begin

Before you jump into this article and code, there are several things I'd like to address. I'll keep the brevity of each at a non-intrusive level.

#1: The most important

Google is a wonderful service provided to us free of charge, please respect this and refrain from abusing Google. Try to keep your queries minimal, don't bombard Google's servers with thousands of needless requests.

#2: Susceptible to change

Google definitely isn't immune to change. If Google heavily modifies the format in which results are returned, this class may fail to retrieve the proper results. Such a possibility is very rare in the short-term future, but if it does occur, I'll update CGoogle to comply with any new formatting standards.

#3: A note about MFC

I'm certain there are many of you weeping (I can dream, can't I?) as you learn this class is MFC dependent. But don't runaway, there is good news! Very shortly, I'll provide a non-MFC class version, which will be my personal preference over the MFC dependency.

Using the code

In the past, I've been criticized for publishing articles which are needlessly long, so I'll attempt to restrain myself on this article. Particularly because there isn't much to explain, using Google is simple, so shouldn't accessing it with your program be simple as well? My opinion revolves around an obvious yes.

Searching Google

Throughout this class are six different public access functions, but most likely you'll only use four of them. I'll start with the most important function first.

If and when you're ready to search Google, you employ PerformSearch to do the work for you. The function takes only one parameter, which is a character array containing your search term(s). PerformSearch returns true on success and false on failure.

You can enable or disable your search to be parentally safe with SetSafeSearch. By default, safe search is disabled.

Getting the Result Count

When you are ready to retrieve the results, you'll need to know how many results were found so you do not unintentionally step out of bounds. Calling GetResultCount will clearly return the number of results found.

Retrieving Results

After you've called PerformSearch, you'll surely want to retrieve individual results for further processing, you may do so with either the subscript operator or by using GetAt.

GetAt will return a pointer to the result located at the given zero-based index; if the result does not exist at the specified position, NULL is returned.

The subscript operator will return a reference to the corresponding result, however, it isn't bounds safe (meaning it will fail if the passed index is less than zero or greater than or equal to GetResultCount()).

The base return type shared by both is GoogleResult, which is a structure conveniently containing the result's URL (cstrURL), title (cstrTitle), and description (cstrDesc).

But what is an article without examples? Certainly not appealing? For those of you that may find yourselves in a predicament when it comes to using this class, perhaps this keen example will provide itself to be a useful reference:

/* The following will search google for "The Code Project"
 and display the first 3 results in message boxes */

bool GoogleTest()
    CGoogle google;

    if  (!google.PerformSearch( "\"The Code Project\"" ))
        return false;  // Failed

    size_t nResultCount = google.GetResultCount();

    for ( size_t n=0; n < nResultCount && n < 3; ++n)
        ::MessageBox(  NULL, google[n].cstrTitle,  "Result Title",
                                             MB_ICONINFORMATION );

        ::MessageBox(  NULL, google[n].cstrURL,  "Result URL",
                                         MB_ICONINFORMATION );

        ::MessageBox(  NULL, google[n].cstrDesc,  "Result Description",
                                                  MB_ICONINFORMATION );

    return true;


  • March 23, 2005 - Began work on CGoogle.
  • March 24, 2005 - Submitted CGoogle to The Code Project.
  • April 06, 2005 - Fixed minor bounds bug.
  • April 10, 2005 - Fixed bug affecting description-less results.
  • November 7, 2005 - Updated code to be compatible with new Google search results.
  • November 29, 2005 - Updated code to be compatible with new Google search results.


This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


About the Author

Stuart Konen
United States United States
Well first of all, it is fairly obvious my name is Stuart Konen (I'm sure 50% of you just took notice), all of my life I've lived on a farm located in Northern Idaho. What shatters the stereotype of rural residence however, is the fact that I'm very active in the technology and programming worlds. I took up the hobby of programming at age 9, at that point it was little language known as Quick Basic *sigh*. Fast forward another 9 years... (Woah... I just realized that's half of my existence. But that's something I'll have to contemplate later, as I have an autobiography to tell).

Now my experience in programming has improved vastly, I've released various technologies and programs and I'm continuing to pump out concepts and systems that are getting glances from all over the world. My weapon of choice is C++, the core language of the majority of freshly released software, it's sleak, mean, and incrediably powerful. On the side I venture into web application development and site design, where my interest lies in PHP. Over the years my project have included everything from Artificial Intelligence to Web Statistic Tracking systems, but that's the past. What matters is the future... Remember that question we were always asked in grade school? Where did we see ourselves in 10 years. Well that question was asked about 8 years ago in my life, so it looks as though I only have two more for planning stages. In two years I see myself plunging into the world of research, creating my own Research and Development firm, aiming to meet the never-ending need for new and superior software and technology. Soon after becoming a multi-billionare I'll pursue my dream of world domination. Nobody is perfect...

Actually when it comes down to things, the money has no meaning. But there you have it, a 5 minute slice of my thoughts and time... If you have any job opportunities or have the slight urge to initiate a conversation with me, it can be done via email: skonen [at] gmail [dot] com

Comments and Discussions

GeneralUNICODE fails Pin
Alex Evans11-Apr-05 17:25
memberAlex Evans11-Apr-05 17:25 
GeneralRe: UNICODE fails Pin
Stuart Konen11-Apr-05 21:53
memberStuart Konen11-Apr-05 21:53 
GeneralRe: UNICODE fails Pin
Alex Evans11-Apr-05 22:09
memberAlex Evans11-Apr-05 22:09 
GeneralUNICODE fails Pin
Alex Evans12-Apr-05 17:53
memberAlex Evans12-Apr-05 17:53 
GeneralRe: UNICODE fails - solved Pin
Stuart Konen12-Apr-05 21:13
memberStuart Konen12-Apr-05 21:13 
GeneralRe: UNICODE fails - solved Pin
Alex Evans13-Apr-05 11:28
memberAlex Evans13-Apr-05 11:28 
Generaldebug assertion failed... Pin
scoroop9-Apr-05 13:24
memberscoroop9-Apr-05 13:24 
GeneralRe: debug assertion failed... Pin
Stuart Konen9-Apr-05 21:16
memberStuart Konen9-Apr-05 21:16 
GeneralRe: debug assertion failed... Pin
scoroop12-Apr-05 15:02
memberscoroop12-Apr-05 15:02 
GeneralRe: debug assertion failed... Pin
geoyar28-May-05 13:42
membergeoyar28-May-05 13:42 
I also used your example in a console application (cout << cstrTitle, etc.) and also got "Debug Assertion Failed".

Search for Code Project returns nResultCount = 638. If you do loop for n < 49, all is working fine. But at n = 49 you are getting "Debug assertion failed. File afxtempl.h, line 288.

I used Google.h and Google.cpp downloaded 5/28/2005.

GeneralNice article, little bug... Pin
Çetin Koca6-Apr-05 9:43
memberÇetin Koca6-Apr-05 9:43 
GeneralRe: Nice article, little bug... Pin
Stuart Konen7-Apr-05 3:42
memberStuart Konen7-Apr-05 3:42 
GeneralNice! Pin
Ravi Bhavnani29-Mar-05 3:01
professionalRavi Bhavnani29-Mar-05 3:01 
GeneralWOW nice work Pin
Sudhir Mangla28-Mar-05 17:48
professionalSudhir Mangla28-Mar-05 17:48 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Posted 28 Mar 2005


81 bookmarked