Technical notes
xCHM has been implemented by creating a wxWidgets virtual filesystem that allows referring to a page in a .chm archive as "file:example.chm#xchm:/page.html". I've written a C++ wrapper around the CHMLIB C API, and added a few things of my own, such as: code for figuring out where the contents description file is in the archive, what the default page's name is, and so on. As the index file is parsable as HTML, I extended my own parser and taghandler from the respective wxWidgets classes, and used that to populate the topics tree.
I also added some code for fast searching through all the pages of the book, based on the $FIftiMain file that can be found inside indexed .chm archives. $FIftiMain is a search tree (B-tree) that, when used, yields logarithmic search times as opposed to a regular grep-like search. Initially, xCHM used a grep search wired in that seemed to work fine with small .chm files, but after some hiccups I decided to completely replace it with the fast index search (implemented since version 0.8.1). The fast index search could not have been done without Pabs' help, and in fact parts of the code have been 'borrowed' from his chmdeco project.
Sometime after version 1.0 I've written code to take advantage of more binary information in the .chm files, and now the topics and index are being extracted faster. The HTML parser that extracts information from .hhc/.hhk files is still in service, but it's only used as a fallback strategy for files without a binary index or a binary topics list.
xCHM allows XMLRPC to be used to make it display specific topics from a .chm file it's currently viewing. If you're interested in more details please see the FAQ page.
The rest is pretty much boilerplate UI code.
If you would like to see the class hierarchy in more detail, you can look at it online here.
I assume there are probably some bugs left. I am much more interested in bug reports than feature requests.
Please point out the problem and the code section that needs improvement in bug reports. If possible, I'll need the input data as well (the .chm file that crashed/confused xCHM).
Limitations
xCHM can't handle:
* .chm files packing .mht files. The wxHtmlWindow component can only handle HTML pages. I couldn't fix this one even if I wanted to; I have no clue about .mht - and it's really a wxWidgets problem (as far as it is a problem).
* non-trivial JavaScript, VBScript or <InsertNameHere>Script. In fact, I believe that at the time I'm writing this the wxHtmlWindow component completely ignores all of the above.
* 'very proprietary' .chm files, making heavy use of MS-ITS:, mk:@MSITStore: links. The latter is not even supported by xCHM. So if you're trying to read Windows help files and can't quite make it, better just boot it and use hh.exe.
* complicated non-Latin charsets. It can handle some of them, sometimes. But fonts on your platform are probably not the fonts available on Windows.
* probably other things as well.