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

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

ShellExecute と ShellExecuteEx の使用

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

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

オブジェクト動詞

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

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

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

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

\ HKEY_CLASSES_ROOT\ object_nameシェル\動詞

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

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

動詞 説明
編集 エディターを起動し、編集用にドキュメントを開きます。
検索 指定したディレクトリから検索を開始します。
開く アプリケーションを起動します。 このファイルが実行可能ファイルでない場合は、関連付けられているアプリケーションが起動されます。
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 つが "検索" になります。 その項目を選択すると、シェルは検索ユーティリティを起動します。 このユーティリティは、指定したテキスト文字列のファイルを検索するために使用できるダイアログ ボックスを表示します。 アプリケーションは、 シェルExecute を呼び出し、 lpVerb パラメーターとして "find" を、ディレクトリ パスを lpFile パラメーターとして呼び出すことで、ディレクトリの検索ユーティリティをプログラムで起動できます。 たとえば、次のコード行は、c:\MyPrograms ディレクトリの検索ユーティリティを起動します。

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 に設定され、既定の操作が開始されます。 この場合、既定の操作は "open" です。 その後、 構造体が ShellExecuteEx に渡され、通常はMSPaint.exeビットマップ ファイルの既定のハンドラーが起動され、ファイルが開きます。 関数が戻ると、PIDL が解放され、Windows フォルダーの IShellFolder インターフェイスが解放されます。