#navi_header|技術| "http://"や"ftp://"など、一部のインターネットプロトコルのURLは拡張子と同様、そのプロトコル名でレジストリに関連づけが登録されている。ShellExecute()でファイル名を"http://"や"ftp://"など、レジストリに関連づけされたプロトコル名で始まるURIを指定することで、レジストリに設定されたデフォルトのWebブラウザやメーラを起動することができる。 簡単なサンプルと併せて、拡張子と関連づけされたアプリケーションが起動する為のレジストリ設定内容をざっくりとまとめておく。 #more|| 対象: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時点のものです。 ---- #outline|| ---- * ShellExecute()のサンプル defaultbrowser.c: #code|c|> #include #include #include #include #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://"や"ftp://"で始まるか・始まっていれば関連づけされているかチェック + 拡張子で関連づけされているかチェック ** "http://" や "ftp://" などプロトコルの関連づけで調べるレジストリキー + HKCR\(プロトコル)\shell\open\command の既定値から実行ファイルとコマンドラインオプションを取得する。 例:"http://www.google.com" を開く(Firefoxがデフォルトの場合) + HKCR\http\shell\open\command の既定値を取得 ++ → '"C:\Program Files\Mozilla Firefox\firefox.exe" -requestPending -osint -url "%1"' で "%1" をURLに変換して実行 ** ".txt"や".jpeg"など一般的なファイルで拡張子の関連づけで調べるレジストリキー + HKCR(HKEY_CLASSES_ROOT)\(拡張子) の既定値からProgIDを取得する。 + HKCR\(ProgID)\shell\(ShellExecute()のlpOperation)\command の既定値から実行ファイルとコマンドラインオプションを取得する。 例:"foo.txt"を開く + HKCR\.txt → 既定値は "txtfile" + HKCR\txtile\shell\open\command の既定値を取得 ++ → "%SystemRoot%\system32\NOTEPAD.EXE %1" で "%1" をfoo.txtに変換して実行 ** HKCRの内訳 HKCRは次の二つのキーをマージしたVIEWになっている。 HKLM(HKEY_LOCAL_MACHINE)\Software\Classes : システム全体の設定 HKCU(HKEY_CURRENT_USER)\Software\Classes : ユーザー毎の設定 - 拡張子, ProgID, CLSIDなど関連キーが全て Software\Classes の下に配置されている点に注意。 - HKLM\Software\Classes と HKCU\Software\Classes に同じキーがあった場合は、HKCU, ユーザー毎の設定が優先されてHKCRから取得される。 * 参考URL ** デフォルトブラウザのレジストリ設定 ファイルの関連づけの仕組みがWindowsVista以降で変更されたらしく、それらについても言及されている。 - How Does Your Browser Know that It’s Not The Default? ? The New Old Thing -- http://newoldthing.wordpress.com/2007/03/23/how-does-your-browsers-know-that-its-not-the-default-browser/ -- 今回の記事のテーマそのものズバリの記事その1。Vista以降で変更された点についても記載有り。 - browser type using C# -- http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/d4d85450-7292-454f-9720-b7149825a30b -- C#でのデフォルトブラウザの取得についてのQ&A。ただし回答に示されているレジストリキーはVista以降のものになっている。 - Make the browser default -- http://social.msdn.microsoft.com/Forums/en/vbgeneral/thread/57912ee0-3e72-4975-9ace-6eb33c49ceaf -- デフォルトブラウザを設定する為のVista以降のレジストリキーや"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.htm\UserChoice"の説明など。 ** ShellExecute(), ShellExecuteEx()関連 - Use ShellExecute to launch the default Web browser (日本語訳:ShellExecute を使用して、既定の Web ブラウザーを起動するには) -- http://support.microsoft.com/kb/224816 -- 今回の記事のテーマそのものズバリの記事その2。今回の記事では取りあげていませんが、DDEサポートについても言及されています。 - Launching Applications (ShellExecute, ShellExecuteEx, SHELLEXECUTEINFO) -- http://msdn.microsoft.com/en-us/library/bb776886.aspx -- "MSDN Library" > "Windows Development" > "Windows Environment Development" > "Windows Shell" > "Shell Developer's Guide" > "Supporting Shell Applications" > "Launching Applications (ShellExecute, ShellExecuteEx, SHELLEXECUTEINFO)" - A newbie's elementary guide to spawning processes - CodeProject -- http://www.codeproject.com/KB/system/newbiespawn.aspx -- ShellExecute(), ShellExecuteEx(), CreateProcess()でのプロセス起動に関する初心者向けQ&A ** レジストリ関連 - レジストリの直接編集によるファイルの拡張子と関連づけ - Glamenv-Septzen.net -- [[14]] -- 大分昔に書いた記事でMSDNのリンク先など変わってしまっていますが、「プログラムから開く」の履歴についても調べています。 - HKEY_CLASSES_ROOT Key -- http://msdn.microsoft.com/en-us/library/ms724475.aspx -- "MSDN Library" > "Windows Development" > "System Services" > "Windows System Information" > "Registry" > "About the Registry" > "Predefined Keys" > "HKEY_CLASSES_ROOT Key" - Windows Vista 既定のプログラム 関連付け レジストリ とかの話 -- http://www.officedaytime.com/tips/vistaprogram.htm -- Windows Vista以降大幅に変更された関連づけの仕組みについて、図入りの解説。 #navi_footer|技術|