home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

技術/Windows/ShellExecute()とデフォルトブラウザの起動、拡張子の関連付け

技術/Windows/ShellExecute()とデフォルトブラウザの起動、拡張子の関連付け

技術 / Windows / ShellExecute()とデフォルトブラウザの起動、拡張子の関連付け
id: 695 所有者: msakamoto-sf    作成日: 2010-07-04 22:48:27
カテゴリ: C言語 Windows hacks プログラミング 

"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時点のものです。



ShellExecute()のサンプル

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()での関連づけチェックは、次の順序で行われる。

  1. "http://"や"ftp://"で始まるか・始まっていれば関連づけされているかチェック
  2. 拡張子で関連づけされているかチェック

"http://" や "ftp://" などプロトコルの関連づけで調べるレジストリキー

  1. HKCR\(プロトコル)\shell\open\command の既定値から実行ファイルとコマンドラインオプションを取得する。

例:"http://www.google.com" を開く(Firefoxがデフォルトの場合)

  1. HKCR\http\shell\open\command の既定値を取得
    1. → '"C:\Program Files\Mozilla Firefox\firefox.exe" -requestPending -osint -url "%1"' で "%1" をURLに変換して実行

".txt"や".jpeg"など一般的なファイルで拡張子の関連づけで調べるレジストリキー

  1. HKCR(HKEY_CLASSES_ROOT)\(拡張子) の既定値からProgIDを取得する。
  2. HKCR\(ProgID)\shell\(ShellExecute()のlpOperation)\command の既定値から実行ファイルとコマンドラインオプションを取得する。

例:"foo.txt"を開く

  1. HKCR\.txt → 既定値は "txtfile"
  2. HKCR\txtile\shell\open\command の既定値を取得
    1. → "%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以降で変更されたらしく、それらについても言及されている。

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

レジストリ関連



プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2010-07-13 12:18:07
md5:dd908f1801584e5bb1df7ed01592158b
sha1:39e1e86b3af0ceadf455719813fbf65cc63c27c9
コメント
コメントを投稿するにはログインして下さい。