SHELLEXECUTEINFO

ShellExecuteEx 関数によって作成されるプロセスの情報を定義します。

typedef struct _SHELLEXECUTEINFO {
    DWORD     cbSize;       // 構造体サイズ(=60)
    ULONG     fMask;        // オプション
    HWND      hwnd;         // 親ウィンドウ
    LPCTSTR   lpVerb;       // 動作名
    LPCTSTR   lpFile;       // ファイル名
    LPCTSTR   lpParameters; // コマンドラインパラメータ
    LPCTSTR   lpDirectory;  // 起動時ディレクトリ
    int       nShow;        // 表示形式
    HINSTANCE hInstApp;     // 結果値
    LPVOID    lpIDList;     // アイテムIDリスト
    LPCTSTR   lpClass;      // クラス名
    HKEY      hkeyClass;    // ファイルクラスのレジストリキー
    DWORD     dwHotKey;     // ホットキー
    union {
        HANDLE  hIcon;      // ファイルクラスのアイコン
        HANDLE  hMonitor;   // モニタ
    } DUMMYUNIONNAME;
    HANDLE    hProcess;     // プロセスハンドル
} SHELLEXECUTEINFO, FAR *LPSHELLEXECUTEINFO;

メンバ

cbSize

この構造体のサイズです。 60 を指定します。

fMask

オプションを設定します。このパラメータの指定によって有効メンバが決定されます。以下の値の組み合わせで指定します。

意味
0x00000001 (SEE_MASK_CLASSNAME)

lpClass メンバによって与えられるクラス名を使用します。

0x00000003 (SEE_MASK_CLASSKEY)

hkeyClass メンバによって与えられるクラスキーを使用します。

0x00000004 (SEE_MASK_IDLIST)

lpIDList メンバによって与えられるアイテム ID リストを使用します。

0x0000000c (SEE_MASK_INVOKEIDLIST)

アプリケーションを呼び出すために lpIDList メンバによって与えられるアイテム ID リストを使用します。 lpIDList メンバが 0 (NULL) の場合は、アイテム ID リストを作成してアプリケーションを呼び出します。このフラグは SEE_MASK_IDLIST を含みます。

0x00000010 (SEE_MASK_ICON)

hIcon メンバで与えられるアイコンを使用します。このフラグを SEE_MASK_HMONITOR と組み合わせて指定することはできません。

0x00000020 (SEE_MASK_HOTKEY)

dwHotKey メンバで与えられるホットキーを使用します。

0x00000040 (SEE_MASK_NOCLOSEPROCESS)

プロセスハンドルをクローズしないようにします。 hProcess メンバにプロセスハンドルが格納されます。

0x00000080 (SEE_MASK_CONNECTNETDRV)

lpName メンバはネットワーク上のファイルの UNC(Universal Naming Convention)パス名であることを表します。

0x00000100 (SEE_MASK_FLAG_DDEWAIT)

DDE 対話が開始される場合には、それが終了するまで再開されません。

0x00000200 (SEE_MASK_DOENVSUBST)

lpDirectory メンバや lpFile メンバで与えられる文字列で指定された環境変数を拡張します。

0x00000400 (SEE_MASK_FLAG_NO_UI)

エラーが発生しても、エラーメッセージボックスを表示しません。

0x00004000 (SEE_MASK_UNICODE)

Unicode アプリケーションであることを示すのにこのフラグを指定します。

0x00008000 (SEE_MASK_NO_CONSOLE)

親プロセスのコンソールを使用せずに、新しいプロセスのためにコンソールを作成します。これは CreateProcess 関数で CREATE_NEW_CONSOLE フラグを指定した場合と同等です。

0x00200000 (SEE_MASK_HMONITOR)

マルチモニタシステム上でモニタを指定する場合に、このフラグを使います。使用されるモニタは hMonitor メンバによって指定されます。このフラグを SEE_MASK_ICON と組み合わせて指定することはできません。

0x04000000 (SEE_MASK_FLAG_LOG_USAGE)

Windows XP 以降: アプリケーションが起動された回数を保持します。起動された回数が特に多いアプリケーションは、スタートメニューの、よく使用されるアプリケーションのリストに表示されます。

hwnd

関数実行中にシステムがメッセージボックスを表示する場合のために、そのメッセージボックスのオーナーウィンドウのハンドルを指定します。

lpVerb

動作名を表す文字列のアドレスを指定します。利用可能な動作名はファイルやフォルダに依存します。通常、オブジェクトのショートカットメニューから利用可能な動作名は、このメンバで指定できます。一般的に、動作名には以下のものが使われます。

文字列 意味
"edit"

エディタを起動し、編集のためにドキュメントを開きます。 lpFile メンバがドキュメントファイルでない場合は、関数は失敗します。

"explore"

lpFile メンバで指定されたフォルダをエクスプローラで開きます。

"find"

指定されたディレクトリから開始される検索を実行します。

"open"

lpFile メンバで指定された実行可能ファイル、ドキュメントファイル、フォルダを開きます。

"print"

lpFile メンバで指定されたドキュメントファイルを印刷します。 lpFile メンバがドキュメントファイルでない場合は、関数は失敗します。

"properties"

ファイルまたはフォルダのプロパティを表示します。

Windows 95/98/NT: このメンバに 0 (NULL) を指定した場合、デフォルトの動作がレジストリ上で有効で、利用可能である場合には、デフォルトの動作が使用されます。それ以外の場合には "open" が使用されます。

Windows Me/2000/XP: このメンバに 0 (NULL) を指定した場合、デフォルトの動作が利用可能である場合には、デフォルトの動作が使用されます。そうでない場合には "open" が使用されます。デフォルトの動作が指定されておらず、 "open" の動作が利用可能でない場合には、レジストリにある最初の動作が使用されます。

lpFile

ファイルまたはオブジェクトの名前を表す文字列のアドレスを指定します。

lpFile メンバに SEE_MASK_INVOKEIDLIST が指定されている場合は、 lpFile メンバを使用してファイルシステムパスでアイテムを指定するか、または lpIDList メンバを使用して PIDL でアイテムを指定することができます。

ファイル名にパスが含まれていない場合は、カレントディレクトリにあるファイルであるとみなされます。

lpParameters

コマンドラインパラメータを表す文字列のアドレスを指定します。コマンドラインパラメータが必要ないときは 0 (NULL) を指定します。 lpFile メンバがドキュメントファイルを表す場合は 0 (NULL) を指定しなければなりません。

lpDirectory

作業ディレクトリを示す文字列のアドレスを指定します。明示的に指定されない場合は、カレントディレクトリが作業ディレクトリとして使われます。

nShow

ウィンドウの表示形式を指定します。 ShowWindow 関数の nCmdShow パラメータで指定される SW_ 値のいずれかを指定します。

hInstApp

関数が成功すると 33 以上の値になります。失敗すると 32 以下の値が格納されます。主なエラーコードは以下のようになります。

意味
2 (SE_ERR_FNF) ファイルが見つかりません。
3 (SE_ERR_PNF) パスが見つかりません。
5 (SE_ERR_ACCESSDENIED) ファイルアクセスが拒否されました。
8 (SE_ERR_OOM) メモリ不足です。
26 (SE_ERR_SHARE) 共有違反が発生しました。
27 (SE_ERR_ASSOCINCOMPLETE) ファイル関連付けが完全ではないか無効です。
28 (SE_ERR_DDETIMEOUT) DDE トランザクションがタイムアウトにより中断されました。
29 (SE_ERR_DDEFAIL) DDE トランザクションが失敗しました。
30 (SE_ERR_DDEBUSY) 他の DDE トランザクションが処理されていたため DDE トランザクションが終了できませんでした。
31 (SE_ERR_NOASSOC) ファイル関連付けが不明です。
32 (SE_ERR_DLLNOTFOUND) DLL が見つかりません。
lpIDList

実行するファイルを識別するアイテム ID リストを含む ITEMIDLIST 構造体へのポインタ( PIDL )を指定します。 fMask メンバで SEE_MASK_IDLIST または SEE_MASK_INVOKEIDLIST を指定した場合のみ有効です。

lpClass

ファイルクラス名または GUID を指定する文字列のアドレスを指定します。 fMask メンバで SEE_MASK_CLASSNAME を指定した場合のみ有効です。

hkeyClass

ファイルクラスのレジストリキーのハンドルを指定します。 fMask メンバで SEE_MASK_CLASSKEY を指定した場合のみ有効です。

dwHotKey

アプリケーションと関連付けるホットキーを指定します。下位ワードには仮想キーコードを、上位ワードには以下の修飾フラグを指定します。 fMask メンバで SEE_MASK_HOTKEY を指定した場合のみ有効です。

0x01 (HOTKEYF_SHIFT) [Shift]
0x02 (HOTKEYF_CONTROL) [Ctrl]
0x04 (HOTKEYF_ALT) [Alt]
0x08 (HOTKEYF_EXT) 拡張キー
hIcon

ファイルクラスのアイコンのハンドルです。 fMask メンバで SEE_MASK_ICON を指定した場合のみ有効です。

hMonitor

ドキュメントが表示されるモニタのハンドルです。 fMask メンバで SEE_MASK_HMONITOR を指定した場合のみ有効です。

hProcess

新しく作成されたプロセスのハンドルが格納されます。この場合は、ハンドルが不要になったら CloseHandle 関数でハンドルをクローズしなければなりません。 fMask メンバで SEE_MASK_NOCLOSEPROCESS が指定されない場合は常に 0 (NULL) が格納されます。

SEE_MASK_NOCLOSEPROCESS が指定された場合であっても、新しくプロセスが起動されなかった場合には 0 (NULL) が格納されます。例えば、ドキュメントとして URL を指定した場合に、 Internet Explorer が既に起動されていると、新しいプロセスが起動されずにドキュメントそのウィンドウに表示されるため、このメンバは 0 (NULL) になります。

関数呼び出しの結果として新しいプロセスが起動された場合でも、 hProcess メンバにプロセスのハンドルが格納されるとは限りません。例えば、 SEE_MASK_INVOKEIDLIST フラグを指定して IContextMenu インターフェースを呼び出した場合にはプロセスハンドルは返されません。

解説

ShellExecuteEx 関数呼び出しスレッドがメッセージループを持たない場合や、ShellExecuteEx 関数を呼び出してすぐにスレッドまたはプロセスが終了する場合には、 fMask メンバに SEE_MASK_FLAG_DDEWAIT フラグを指定しなければなりません。

対応情報

Windows 95 以降 / Windows NT 3.51 以降

変数との対応

HSP 変数 メンバ
メンバ名 オフセット サイズ
shexec.0 cbSize ( = 60 ) 0 4
shexec.1 fMask 4 4
shexec.2 hwnd 8 4
shexec.3 lpVerb 12 4
shexec.4 lpFile 16 4
shexec.5 lpParameters 20 4
shexec.6 lpDirectory 24 4
shexec.7 nShow 28 4
shexec.8 hInstApp 32 4
shexec.9 lpIDList 36 4
shexec.10 lpClass 40 4
shexec.11 hkeyClass 44 4
shexec.12 dwHotKey 48 4
shexec.13 hIcon / hMonitor 52 4
shexec.14 hProcess 56 4