次の方法で共有


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

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

ShellExecute と ShellExecuteEx の使用

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

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

オブジェクト動詞

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

HKEY_CLASSES_ROOT\CLSID\{object_clsid}\Shell\verb

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

定義済みのShell オブジェクトで使用できる動詞を確認するには、レジストリの中を探してください。

HKEY_CLASSES_ROOT\object_name\shell\verb

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

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

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

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

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

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

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

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

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

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

ユーザーが Windows エクスプローラーでフォルダー アイコンを右クリックすると、メニュー項目の 1 つが [検索] になります。 その項目を選択すると、 Shell はその検索ユーティリティを起動します。 このユーティリティは、指定されたテキスト文字列のファイルを検索するために使用できるダイアログ ボックスを表示します。 アプリケーションは、lpVerb パラメーターとして "find" を、lpFile パラメーターとしてディレクトリ パスを指定して ShellExecute を呼び出すことによって、ディレクトリの検索ユーティリティをプログラムで起動できます。 たとえば、次のコード行は、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) が起動され、ファイルが open されます。 関数が戻った後、PIDL が解放され、Windows フォルダーの IShellFolder インターフェイスが解放されます。