In the first three parts I covered how to get a simple IE extension built. For PeteSearch I need to be able to fetch web pages, so the next step is to figure out how to do that in Internet Explorer.
Firefox lets extensions use XMLHTTPRequest objects to fetch pages. It's quite lovely; well documented and tested since it's the basis of most AJAX sites, and with an easy-to-use interface. The first thing I looked for was an IE equivalent.
There's a COM interface called IXMLHTTPRequest that looked very promising, with almost the same interface, but it turned out to involve some very gnarly code to implement the asynchronous callback in C++. It was also tough to find a simple example that didn't involve a lot of ATL and MFC cruft, and it involved using a pretty recent copy of the MSXML DLL, and there were multiple different versions. All-in-all, I ruled it out because it was just sucking up too much time, and I dreaded the maintenance involved in using something so complex.
There's also the newer IWinHttpRequest object, but that's only available on XP, 2000 and NT4.0, and seems far enough off the beaten track that there's no much non-MS documentation on it.
I finally settled on a really old and simple library, WinINet. It's a C-style API, and lower-level than XMLHttpRequest, and is a bit old-fashioned with some situations that require CPU polling, but it offers a full set of HTTP handling functions. It's also been around since 1996, so it's everywhere, and there's lots of examples out on the web. Since I liked the XMLHttpRequest interface, I decided to write my own C++ class implementing the same methods using WinINet under the hood.
Here's the code I came up with. It implements a class called CPeteHttpRequest that has the classic XMLHttpRequest interface, with a simple callback API for async access. I'm making it freely available for any commercial or non-commercial use, and I'll cover my experiences using it with PeteSearch in a later article.
Edit - It turns out that WinInet is actually very prone to crashing when used heavily in a multi-threaded app. You should use my WinHttp based version of this class instead.
Comments