アプリケーションの起動 (ShellExecute、ShellExecuteEx、SHELLEXECUTEINFO)

アプリケーションがファイル オブジェクトを見つけたら、多くの場合、何らかの方法で処理します。 たとえば、アプリケーションで、ユーザーがデータ ファイルを変更できるようにする別のアプリケーションを起動することが必要な場合があります。 目的のファイルが実行可能ファイルの場合は、アプリケーションで起動するだけです。 このドキュメントでは、 ShellExecute または ShellExecuteEx を使用してこれらのタスクを実行する方法について説明します。

ShellExecute と ShellExecuteEx の使用

ShellExecute または ShellExecuteEx を使用するには、アプリケーションで処理するファイルまたはフォルダー オブジェクトと、操作を指定する動詞を指定する必要があります。 ShellExecute の場合は、これらの値を適切なパラメーターに割り当てます。 ShellExecuteEx の場合は、SHELLEXECUTEINFO 構造体の適切なメンバーを入力します。 2 つの関数の動作を微調整するために使用できる他のいくつかのメンバーまたはパラメーターもあります。

ファイル オブジェクトとフォルダー オブジェクトは、ファイル システムまたは仮想オブジェクトの一部にすることができ、項目識別子リスト (PIDL) へのパスまたはポインターによって識別できます。

オブジェクト動詞

オブジェクトで使用できる動詞は、基本的にオブジェクトのショートカット メニューに表示される項目です。 使用できる動詞を見つけるには、 の下にあるレジストリを調べる

\ HKEY_CLASSES_ROOTClsid\{object_clsid}\シェル\動詞

ここで、object_clsid は オブジェクトのクラス識別子 (CLSID) で、verb は使用可能な動詞の名前です。 動詞\コマンド サブキーには、その動詞が呼び出されたときに何が起こるかを示すデータが含まれています。

定義済みのシェル オブジェクトで使用できる動詞を確認するには、 のレジストリを調べる

\ HKEY_CLASSES_ROOT\ object_nameシェル\動詞

ここで、object_nameは定義済みの Shell オブジェクトの名前です。 ここでも、 動詞\コマンド サブキーには、その動詞が呼び出されたときに何が起こるかを示すデータが含まれています。

一般的に使用できる動詞は次のとおりです。

動詞 説明
編集 エディターを起動し、編集用にドキュメントを開きます。
検索 指定したディレクトリから検索を開始します。
開く アプリケーションを起動します。 このファイルが実行可能ファイルでない場合は、関連付けられているアプリケーションが起動されます。
print ドキュメント ファイルを印刷します。
properties オブジェクトのプロパティを表示します。
RunAs 管理者としてアプリケーションを起動します。 ユーザー アカウント制御 (UAC) は、昇格されたアプリケーションの実行に同意するか、アプリケーションの実行に使用する管理者アカウントの資格情報を入力するようにユーザーに求めます。

各動詞は、コンソール ウィンドウからアプリケーションを起動するために使用されるコマンドに対応します。 オープン動詞は一般的にサポートされているため、良い例です。 .exeファイルの場合は、 を開 くだけでアプリケーションを起動します。 ただし、特定のファイルで動作するアプリケーションを起動する場合に、より一般的に使用されます。 たとえば、.txtファイルは Microsoft WordPad で開くことができます。 したがって、.txt ファイルの オープン 動詞は、次のコマンドに対応します。

"C:\Program Files\Windows NT\Accessories\Wordpad.exe" "%1"

ShellExecute または ShellExecuteEx を使用して.txt ファイルを開くと、指定したファイルを引数としてWordpad.exeが起動されます。 一部のコマンドには、アプリケーションを適切に起動するために必要に応じて追加できる追加の引数 (フラグなど) を指定できます。 ショートカット メニューと動詞の詳細については、「ショートカット メニューの拡張」を参照してください。

一般に、特定のファイルで使用できる動詞の一覧を特定しようとすると、やや複雑になります。 多くの場合、 lpVerb パラメーターを NULL に設定するだけで、ファイルの種類の既定のコマンドを呼び出すことができます。 この手順は通常、 lpVerb を "開く" に設定することと同じですが、一部のファイルの種類では既定のコマンドが異なる場合があります。 詳細については、「 ショートカット メニューの拡張 」および ShellExecuteEx リファレンス ドキュメントを参照してください。

ShellExecuteEx を使用してサイトからアクティブ化サービスを提供する

サイト チェーンのサービスは、アイテムのアクティブ化の多くの動作を制御できます。 Windows 8時点で、ShellExecuteEx へのサイト チェーンへのポインターを指定して、これらの動作を有効にすることができます。 ShellExecuteEx にサイトを提供するには:

ShellExecute を使用した検索ダイアログ ボックスの起動

ユーザーが Windows エクスプローラーでフォルダー アイコンを右クリックすると、メニュー項目の 1 つが "検索" になります。 その項目を選択すると、シェルは検索ユーティリティを起動します。 このユーティリティは、指定したテキスト文字列のファイルを検索するために使用できるダイアログ ボックスを表示します。 アプリケーションは、lpVerb パラメーターとして "find" を、lpFile パラメーターとしてディレクトリ パスを指定して ShellExecute を呼び出すことで、ディレクトリの検索ユーティリティをプログラムで起動できます。 たとえば、次のコード行は、c:\MyPrograms ディレクトリの Search ユーティリティを起動します。

ShellExecute(hwnd, "find", "c:\\MyPrograms", NULL, NULL, 0);

ShellExecuteEx の使用方法の簡単な例

次のサンプル コンソール アプリケーションは、 ShellExecuteEx の使用方法を示しています。 ほとんどのエラー チェック コードは、わかりやすくするために省略されています。

#include <shlobj.h>
#include <shlwapi.h>
#include <objbase.h>

main()
{
    LPITEMIDLIST pidlWinFiles = NULL;
    LPITEMIDLIST pidlItems = NULL;
    IShellFolder *psfWinFiles = NULL;
    IShellFolder *psfDeskTop = NULL;
    LPENUMIDLIST ppenum = NULL;
    STRRET strDispName;
    TCHAR pszParseName[MAX_PATH];
    ULONG celtFetched;
    SHELLEXECUTEINFO ShExecInfo;
    HRESULT hr;
    BOOL fBitmap = FALSE;

    hr = SHGetFolderLocation(NULL, CSIDL_WINDOWS, NULL, NULL, &pidlWinFiles);

    hr = SHGetDesktopFolder(&psfDeskTop);

    hr = psfDeskTop->BindToObject(pidlWinFiles, NULL, IID_IShellFolder, (LPVOID *) &psfWinFiles);
    hr = psfDeskTop->Release();

    hr = psfWinFiles->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum);

    while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
    {
        psfWinFiles->GetDisplayNameOf(pidlItems, SHGDN_FORPARSING, &strDispName);
        StrRetToBuf(&strDispName, pidlItems, pszParseName, MAX_PATH);
        CoTaskMemFree(pidlItems);
        if(StrCmpI(PathFindExtension(pszParseName), TEXT( ".bmp")) == 0)
        {
            fBitmap = TRUE;
            break;
        }
    }

    ppenum->Release();

    if(fBitmap)
    {
        ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
        ShExecInfo.fMask = NULL;
        ShExecInfo.hwnd = NULL;
        ShExecInfo.lpVerb = NULL;
        ShExecInfo.lpFile = pszParseName;
        ShExecInfo.lpParameters = NULL;
        ShExecInfo.lpDirectory = NULL;
        ShExecInfo.nShow = SW_MAXIMIZE;
        ShExecInfo.hInstApp = NULL;

        ShellExecuteEx(&ShExecInfo);
    }

    CoTaskMemFree(pidlWinFiles);
    psfWinFiles->Release();

    return 0;
}

アプリケーションは最初に Windows ディレクトリの PIDL を取得し、最初の.bmp ファイルが見つかるまでその内容を列挙します。 前の例とは異なり、 IShellFolder::GetDisplayNameOf を使用して、ファイルの表示名ではなく解析名を取得します。 これはファイル システム フォルダーであるため、解析名は完全修飾パスであり、 これは ShellExecuteEx に必要なパスです。

最初の.bmp ファイルが見つかったら、 SHELLEXECUTEINFO 構造体のメンバーに適切な値が割り当てられます。 lpFile メンバーはファイルの解析名に設定され、lpVerb メンバーは NULL に設定され、既定の操作が開始されます。 この場合、既定の操作は "開く" です。 その後、 構造体が ShellExecuteEx に渡され、ビットマップ ファイルの既定のハンドラー (通常はMSPaint.exe) が起動され、ファイルが開きます。 関数が戻った後、PIDL が解放され、Windows フォルダーの IShellFolder インターフェイスが解放されます。