Oka Laboratory

ShellExecuteEx API

ShellExecuteEx APIを使って、ファイルのプロパティダイアログの表示やクリッカブルURLの実装などを行ないます。

Visual Basic 6(SP3) + Windows95/98 + Internet Explorer 5で動作確認をしています。

ShellExecuteEx APIについて

ShellExecuteEx API、およびクリッカブルURLの実装方法で使用するAPIを以下に示します。ShellExecuteExはShellExecuteと比べて機能が拡張されています。

ShellExecuteEx
機能 指定ファイルを指定した動作で実行します。
宣言
Declare Function ShellExecuteEX Lib "shell32.dll" Alias "ShellExecuteEx" (lpExecInfo As SHELLEXECUTEINFO) As Long
引数 lpExecInfo SHELLEXECUTEINFO構造体のアドレス
戻り値
0以外
成功
0
失敗
GetDesktopWindow
機能 デスクトップウィンドウのハンドルを取得します。
宣言
Declare Function GetDesktopWindow Lib "user32" () As Long
引数 なし
戻り値 デスクトップウィンドウのハンドル

使用する構造体を次に示します。

SHELLEXECUTEINFO構造体
宣言
Public Type SHELLEXECUTEINFO
	cbSize As Long
	fMask As Long
	hWnd As Long
	lpVerb As String
	lpFile As String
	lpParameters As String
	lpDirectory As String
	nShow  As Long
	hInstApp As Long
	lpIDList As Long	'これ以下のメンバはオプション
	lpClass As String
	hkeyClass As Long
	dwHotKey As Long
	hIcon As Long
	hProcess As Long
End Type
メンバ cbSize 構造体のサイズ
fMask 処理制御フラグ。2つ以上設定するときはOr演算子で結びます。
SEE_MASK_CLASSKEY (&H3)
hkeyClassメンバで与えられたクラスを使用
SEE_MASK_CLASSNAME (&H1)
lpClassメンバで与えられたクラス名を使用
SEE_MASK_CONNECTNETDRV (&H80)
ネットワークドライブに接続
SEE_MASK_DOENVSUBST (&H200)
lpDirectoryもしくはlpFileメンバで与えられた文字列で環境変数を拡張
SEE_MASK_FLAG_DDEWAIT (&H100)
ShellExecute APIがDDE通信を始めたとき、DDE通信終了まで待機
SEE_MASK_FLAG_NO_UI (&H400)
エラー発生時にメッセージBoxを表示しない
SEE_MASK_HOTKEY (&H20)
dwHotKeyメンバで与えられたホットキーを使用
SEE_MASK_ICON (&H10)
hIconメンバで与えられたアイコンを使用
SEE_MASK_IDLIST (&H4)
lpIDListメンバで与えられた項目IDリストを使用
SEE_MASK_INVOKEIDLIST (&HC)
アプリケーションを実行するために、lpIDListメンバで与えられた項目IDリストを使用。lpIDListが0ならば、ShellExecuteEx APIがIDリストを作成する。
SEE_MASK_NOCLOSEPROCESS (&H40)
ShellExecute APIの実行後、プロセスを維持。hProcessメンバにプロセスのハンドルが返る。
hWnd ShellExecuteEXを呼び出すウィンドウのハンドル
lpVerb 処理制御文字列。指定しないときは"open"になります。
"open"
lpFileメンバに設定されたファイルを開く。実行ファイル、ドキュメントファイル、フォルダの何れでも可。
"print"
lpFileメンバに設定されたドキュメントファイルを印刷する。実行ファイルでは、openと同じ動作をする。
"explorer"
lpFileメンバに設定されたフォルダを検索する。
"properties"
lpFileメンバに設定されたファイルのプロパティダイアログを開く。実行ファイル、ドキュメントファイル、フォルダの何れでも可。
lpFile 起動するファイルの名前
lpParameters 起動する実行可能ファイルへのパラメータ(lpFileメンバが実行可能ファイルのとき)。lpFileメンバがドキュメントファイルのときは設定しないで下さい。
lpDirectory 作業用ディレクトリ。設定しないときはカレントディレクトリになります。
nShow 起動する実行ファイルのウィンドウの状態
SW_FORCEMINIMIZE (11)
ウィンドウを所有しているスレッドがハング状態であっても最小化
SW_HIDE (0)
非表示
SW_MAXIMIZE (3)
最大化
SW_MINIMIZE (6)
非アクティブで最小化
SW_RESTORE (9)
元の位置とサイズで表示。最小化または最大化されているときは、位置とサイズを元に戻します。
SW_SHOW (5)
現在の位置とサイズで表示
SW_SHOWDEFAULT (10)
アプリケーションを起動したプログラムが CreateProcess関数に渡したSTARTUPINFO構造体で指定されたSW_フラグに従って表示
SW_SHOWMAXIMIZED (3)
最大化
SW_SHOWMINIMIZED (2)
アクティブにして最小化
SW_SHOWMINNOACTIVE (7)
最小化。アクティブ状態は変化しません。
SW_SHOWNA (8)
現在の状態で表示。アクティブなウィンドウはアクティブな状態を維持します。
SW_SHOWNOACTIVATE (4)
直前の位置とサイズで表示。アクティブなウィンドウはアクティブな状態を維持します。
SW_SHOWNORMAL (1)
アクティブにして表示。最小化または最大化されているときは、位置とサイズを元に戻します。
hInstApp
33以上
インスタンスハンドル
32以下
下に示すエラー値
SE_ERR_ACCESSDENIED (5)
アクセスが拒否されました。
SE_ERR_ASSOCINCOMPLETE (27)
ファイルの関連付け情報が不完全です。
SE_ERR_DDEBUSY (30)
DDEがビジーです。
SE_ERR_DDEFAIL (29)
DDEが失敗しました。
SE_ERR_DDETIMEOUT (28)
DDEがTime Outです。
SE_ERR_DLLNOTFOUND (32)
DDLが見つかりません。
SE_ERR_FNF (2)
ファイルが見つかりません。
SE_ERR_NOASSOC (31)
ファイルの関連付けが利用できません。
SE_ERR_OOM (8)
メモリが不足しています。
SE_ERR_PNF (3)
パスが見つかりません。
SE_ERR_SHARE (26)
開いたファイルは共有できません。
lpIDList ITEMIDLIST構造体のアドレス。fMaskメンバにSEE_MASK_IDLISTが設定されていないと無視します。(オプション)
lpClass ファイルクラス名もしくはGUID。fMaskメンバにSEE_MASK_CLASSNAMEが設定されていないと無視します。(オプション)
hkeyClass ファイルクラスのレジストリキーのハンドル。fMaskメンバにSEE_MASK_CLASSKEYが設定されていないと無視します。(オプション)
dwHotKey 実行ファイルに関連したホットキー。fMaskメンバにSEE_MASK_HOTKEYが設定されていないと無視します。(オプション)
hIcon ファイルクラスのアイコンハンドル。fMaskメンバにSEE_MASK_ICONが設定されていないと無視します。(オプション)
hProcess 実行ファイルのハンドル。fMaskメンバにSEE_MASK_NOCLOSEPROCESSが設定されていないと0になります。(オプション)

「ファイルのプロパティ」ダイアログを開く

アイコンを右クリックしたときに出るメニュー中の[プロパティ(R)]で表示される、「ファイルのプロパティ」ダイアログを呼び出します。引数FileNameには、プロパティを表示するファイルの名前を設定しておきます。

Public Declare Function ShellExecuteEX Lib "shell32.dll" Alias "ShellExecuteEx" (lpExecInfo As SHELLEXECUTEINFO) As Long

Public Type SHELLEXECUTEINFO
	cbSize As Long
	fMask As Long
	hWnd As Long
	lpVerb As String
	lpFile As String
	lpParameters As String
	lpDirectory As String
	nShow As Long
	hInstApp As Long
	lpIDList As Long
	lpClass As String
	hkeyClass As Long
	dwHotKey As Long
	hIcon As Long
	hProcess As Long
End Type

Public Const SEE_MASK_NOCLOSEPROCESS = &H40
Public Const SEE_MASK_INVOKEIDLIST = &HC
Public Const SEE_MASK_FLAG_NO_UI = &H400

Public Sub FileProperty(FileName As String)
'「ファイルのプロパティ」ダイアログを開く
	Dim ShellInfo As SHELLEXECUTEINFO

	With ShellInfo
		.cbSize = Len(ShellInfo)
		.fMask = SEE_MASK_NOCLOSEPROCESS Or SEE_MASK_INVOKEIDLIST Or SEE_MASK_FLAG_NO_UI
		.hWnd = Me.hWnd
		.lpVerb = "properties" & vbNullChar
		.lpFile = FileName & vbNullChar		'プロパティを表示するファイルの名前
		.lpParameters = vbNullChar
		.lpDirectory = vbNullChar
		.nShow = 0
		.hInstApp = 0
		.lpIDList = 0
	End With

	ShellExecuteEX ShellInfo
End Sub

クリッカブルURLの実装方法

URLを実行し、関連付けられているWebブラウザを起動します。これはShellExecuteを使っても同様にできます。まずフォームにLabelコントロールを貼り付け、プロパティを設定します。ここに示されている以外のプロパティはデフォルトのままです。URL文字列上でカーソルの形状をかえないときはMouseIcon、MousePointerプロパティはデフォルトの設定で構いません。

Labelコントロール
プロパティ (オブジェクト名) Label1
AutoSize True
Caption 表示するURL、(例)http://okalab.la.coocan.jp/
Font MS Pゴシック、標準、9ポイント、下線
ForeColor vbBlue(= &HFF0000、青)
MouseIcon カーソルファイル名(*.cur、MousePointer = vbCustomのときのみ有効)
MousePointer vbDefault(= 0)もしくはvbCustom(= 99)

LabelコントロールのClickイベントに以下のコードを記述します。

Public Declare Function ShellExecuteEX Lib "shell32.dll" Alias "ShellExecuteEx" (lpExecInfo As SHELLEXECUTEINFO) As Long
Public Declare Function GetDesktopWindow Lib "user32" () As Long

Public Type SHELLEXECUTEINFO
	cbSize As Long
	fMask As Long
	hWnd As Long
	lpVerb As String
	lpFile As String
	lpParameters As String
	lpDirectory As String
	nShow As Long
	hInstApp As Long
	lpIDList As Long
	lpClass As String
	hkeyClass As Long
	dwHotKey As Long
	hIcon As Long
	hProcess As Long
End Type

Public Const SW_SHOW = 5
Public Const SEE_MASK_FLAG_NO_UI = &H400

Private Sub Label1_Click()
	Dim ShellInfo As SHELLEXECUTEINFO

	With ShellInfo
		.cbSize = Len(ShellInfo)
		.fMask = SEE_MASK_FLAG_NO_UI
		.hWnd = GetDesktopWindow
		.lpVerb = "open" & vbNullChar		'"open"のときは省略可
		.lpFile = Label1.Caption & vbNullChar	'表示するURL
		.lpParameters = vbNullChar
		.lpDirectory = vbNullChar
		.nShow = SW_SHOW
		.hInstApp = 0
		.lpIDList = 0
	End With

	ShellExecuteEX ShellInfo
End Sub

(付録)ShellExecute APIとShell関数

ShellExecuteEx APIと殆ど同じ機能を有するものとして、ShellExecute APIがあります。SellExecuteEx APIとの違いは、「ファイルのプロパティ」ダイアログが開けないことと、関数の引数でパラメータを設定することです。前述のクリッカブルURLの実装は、このAPIを使っても実現できます。

ShellExecute
機能 指定ファイルを指定した動作で実行します。
宣言
Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
引数 hWnd ShellExecuteを呼び出すウィンドウのハンドル
lpOperation 処理制御文字列。指定しないときは"open"になります。設定値はSHELLEXECUTEINFO構造体のlpVerbメンバを参照してください。但し、"properties"は設定できません。
lpFile 起動するファイルの名前
lpParameters 起動する実行ファイルへのパラメータ(lpFileが実行可能ファイルのとき)。lpFileがドキュメントファイルのときは設定しないで下さい。
lpDirectory 作業用ディレクトリ。設定しないときはカレントディレクトリになります。
nShowCmd 起動する実行可能ファイルのウィンドウの状態。設定値はSHELLEXECUTEINFO構造体のnShowメンバを参照してください。
戻り値
33以上
開いたファイルのインスタンスハンドル
32以下
エラーコード

またVisual Basicには、実行可能ファイルを起動するShell関数があります。この関数では、関連付けされたドキュメントファイルを開くことができないので、実行ファイルのコマンドラインパラメータとして与える必要があります。

Shell関数
機能 実行可能プログラムを実行します。
構文
Shell (PathName, WindowStyle)
引数 PathName 実行可能ファイル名とコマンドラインパラメータを表わす文字列
WindowStyle 以下のVbAppWinStyle定数を指定。SHELLEXECUTEINFO構造体のnShowメンバのSW定数に対応しています。
vbHide (0)
SW_HIDE
vbNormalFocus (1)
SW_SHOWNORMAL
vbMinimizedFocus (2)
SW_SHOWMINIMIZED
vbMaximizedFocus (3)
SW_SHOWMAXIMIZED / SW_MAXIMIZE
vbNormalNoFocus (4)
SW_SHOWNOACTIVATE
vbMinimizedNoFocus (6)
SW_MINIMIZE
戻り値 プログラムのタスクID(プロセスID)

正当なCSSです!