"http://"や"ftp://"など、一部のインターネットプロトコルのURLは拡張子と同様、そのプロトコル名でレジストリに関連づけが登録されている。ShellExecute()でファイル名を"http://"や"ftp://"など、レジストリに関連づけされたプロトコル名で始まるURIを指定することで、レジストリに設定されたデフォルトのWebブラウザやメーラを起動することができる。
簡単なサンプルと併せて、拡張子と関連づけされたアプリケーションが起動する為のレジストリ設定内容をざっくりとまとめておく。
対象:Visual C++ 2008 Express Edition, Windows XP SP3 (Japanese)
> cl Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. > link Microsoft (R) Incremental Linker Version 9.00.30729.01 Copyright (C) Microsoft Corporation. All rights reserved.
※MSDNの記事リンクは2010/7/4時点のものです。
defaultbrowser.c:
#include <windows.h> #include <shellapi.h> #include <objbase.h> #include <stdio.h> #pragma comment(lib, "user32.lib") #pragma comment(lib, "ole32.lib") #pragma comment(lib, "shell32.lib") int main(int argc, char *argv[]) { char *url = NULL; HINSTANCE hInst = NULL; if (2 > argc) { fprintf(stderr, "usage: %s url\n", argv[0]); return 1; } url = argv[1]; // recommended by ShellExecute() MSDN CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); printf("hit return to continue;\n"); getchar(); hInst = ShellExecute( GetDesktopWindow(), "open", url, "", // LPCTSTR lpParameters "", // LPCSTR lpDirectory SW_SHOW); if (32 >= (int)hInst) { fprintf(stderr, "ShellExecute() failed, result = %d\n", hInst); } else { printf("ShellExecute() success, HINSTANCE = 0x%08X\n", hInst); } return 0; }
コンパイル&実行:
> cl defaultbrowser.c > defaultbrowser.exe http://www.google.com/ hit return to continue;(RETURNキーを押す) (ブラウザ起動) ShellExecute() success, HINSTANCE = 0x0000002A
ShellExecute()での関連づけチェックは、次の順序で行われる。
例:"http://www.google.com" を開く(Firefoxがデフォルトの場合)
例:"foo.txt"を開く
HKCRは次の二つのキーをマージしたVIEWになっている。
HKLM(HKEY_LOCAL_MACHINE)\Software\Classes : システム全体の設定 HKCU(HKEY_CURRENT_USER)\Software\Classes : ユーザー毎の設定
ファイルの関連づけの仕組みがWindowsVista以降で変更されたらしく、それらについても言及されている。