Introduction
If you've ever had to look up a Knowledge Base article using its number, you know that the process it a bit
tedious. First browse to msdn.microsoft.com, enter the article number in
the tiny search edit box, wait for the search results to come back, and then finally click the link to the article.
There isn't a quick way to jump right to an article, until now!
KBLaunch is a shell extension that extends the Run dialog. Simply enter ?q
followed by the article
number, as pictured here:
When you hit Enter, KBLaunch runs your default browser and points it right at the web page for the article.
How It Works
KBLaunch registers itself as a shell execute hook. Shell execute hooks are called in two cases:
- Whenever a program is run with
ShellExecute()
or ShellExecuteEx()
. This includes
double-clicking on a file in Explorer.
- Whenever the user enters something in the Run dialog.
What's interesting about hooking the Run dialog is that we can let the user enter something that isn't a program
name, but which instructs our extension to do something. Internet Explorer is a good example of this - if you enter
a URL (starting with http
, ftp
, www
, or other common prefixes), the shell
execute hook provided by IE interprets that and launches the browser.
KBLaunch looks for the prefix ?q
, and then reads the rest of the command line. If it is a positive
number, KBLaunch constructs the URL for the article and runs your default browser with ShellExecute()
,
passing it that URL. Note that this makes use of IE's own shell execute hook (described above) to launch the web
browser, so you'll need IE 3 or later installed.
A shell execute hook extension is almost trivial - there's only one interface to implement, and that interface
only has one method. The method is IShellExecuteHook::Execute()
, and it receives a pointer to a SHELLEXECUTEINFO
struct which holds a bunch of info about the program being run. Execute()
handles parsing the command
line and running the browser, as described above. The code for this is in the KBLaunchShlExt.cpp
file
in the sample project.
Michael lives in sunny Mountain View, California. He started programming with an Apple
//e in 4th grade, graduated from
UCLA with a math degree in 1994, and immediately landed a job as a QA engineer at Symantec, working on the Norton AntiVirus team. He pretty much taught himself Windows and MFC programming, and in 1999 he designed and coded a new interface for Norton AntiVirus 2000.
Mike has been a a developer at
Napster and at his own lil' startup, Zabersoft, a development company he co-founded with offices in Los Angeles and Odense, Denmark. Mike is now a senior engineer at
VMware.
He also enjoys his hobbies of playing pinball, bike riding, photography, and Domion on Friday nights (current favorite combo: Village + double Pirate Ship). He would get his own snooker table too if they weren't so darn big! He is also sad that he's forgotten the languages he's studied: French, Mandarin Chinese, and Japanese.
Mike was a
VC MVP from 2005 to 2009.