Shell 関数

更新 : 2007 年 11 月

実行可能プログラムを実行し、そのプログラムが実行中である場合、プログラムのプロセス ID を格納する整数を返します。

Public Function Shell( _
   ByVal PathName As String, _ 
   Optional ByVal Style As AppWinStyle = AppWinStyle.MinimizedFocus, _ 
   Optional ByVal Wait As Boolean = False, _ 
   Optional ByVal Timeout As Integer = -1 _
) As Integer

パラメータ

  • PathName
    必ず指定します。String です。実行するプログラムの名前と、必要な引数とコマンド ライン スイッチです。PathName には、ドライブとディレクトリ パス、またはフォルダを含めることができます。

    プログラムのファイル パスが不明な場合、My.Computer.FileSystem.GetFiles メソッド を使って参照できます。たとえば、My.Computer.FileSystem.GetFiles("C:\", True, "testFile.txt") を呼び出すことができます。ドライブ C:\ 内にある testFile.txt という名前のすべてのファイルのフル パスを返します。

  • Style
    省略可能です。AppWinStyle です。プログラムを実行するウィンドウのスタイルを指定する AppWinStyle 列挙型 から選ばれた値です。Style を省略すると、Shell は AppWinStyle.MinimizedFocus を使用し、最小化され、フォーカスを持つプログラムを起動します。

  • Wait
    省略可能です。ブール型 (Boolean) です。Shell 関数がプログラムの完了を待つかどうかを示す値を指定します。Wait を省略すると、Shell は False を使用します。

  • Timeout
    省略可能です。Integer です。Wait が True の場合に、完了までかかる時間 (ミリ秒) です。引数 Timeout を省略すると、Shell 関数は -1 を使用します。タイムアウトが無効であり、プログラムの終了まで Shell 関数は制御を戻さないことを示します。このため、引数 Timeout を省略するか、または -1 に設定すると、Shell 関数はプログラムに制御をまったく戻さない可能性があります。

例外

例外の種類

エラー番号

条件

ArgumentException

5

Style が 0 ~ 9 (両端を含む) の範囲内の値ではありません。

FileNotFoundException

53

Shell が PathName ファイルを見つけられません。

NullReferenceException

91

PathName が Nothing。

非構造化エラー処理を使用する Visual Basic 6.0 アプリケーションをアップグレードする場合は、「エラー番号」列を参照してください(エラー番号を Number プロパティ (Err オブジェクト) と照らし合わせます)。しかし、可能な限り、このエラー処理は Visual Basic の構造化例外処理の概要 で置き換えてください。

解説

Shell 関数の戻り値は、引数 PathName に指定されたプログラムが Shell 関数が制御を戻す時点で実行中かどうかを示します。引数 Wait を True に設定し、タイムアウトが満了する前にプログラムが終了する場合、Shell 関数は 0 を返します。タイムアウトが満了するか、または引数 Wait を省略するか False に設定する場合は、Shell 関数はプログラムのプロセス ID を返します。プロセス ID は、実行中のプログラムを識別する、重複しない番号です。

起動の失敗

Shell 関数が指定されたプログラムを起動できない場合、FileNotFoundException エラーが発生します。これは、たとえば System.Windows.Forms を使っているアプリケーションから command.com などの 16 ビットのプログラムを実行しようとしている場合などに起こります。この問題を回避するには、起動したい 16 ビットのプログラムを呼び出す 32 ビットのプログラムを実行します。この場合は、command.com の代わりに cmd.exe を実行します。

完了の待機

既定では、Shell 関数はプログラムを非同期的に実行します。したがって、Shell 関数を使用して実行を開始したプログラムが終了しなくても、Shell 関数の次のステートメントは実行されます。プログラムの終了を待ってから続行する場合は、引数 Wait を True に設定します。

終了コードを決定する

プロセスは、完了時に 終了コード を返すことができます。しかし、Shell は完了を待っている場合 0 を返すため、また、プロセスは Shell とは別のオブジェクトで実行されるため、Shell を使用してこの終了コードを取得することはできません。

プロセスから終了コードを取得するには、プロセスを開始し、完了を待つコードを作成する必要があります。次の例では、プロセスを開始して終了を待ち、終了コードを取得する方法を示します。

Dim procID As Integer
Dim newProc As Diagnostics.Process
newProc = Diagnostics.Process.Start("C:\WINDOWS\NOTEPAD.EXE")
procID = newProc.Id
newProc.WaitForExit()
Dim procEC As Integer = -1
If newProc.HasExited Then
    procEC = newProc.ExitCode
End If
MsgBox("Process with ID " & CStr(ProcID) & _
    " terminated with exit code " & CStr(procEC))

ファイルの指定を保護する

パスとファイルの指定は、次の例のように常に全体を引用符で囲む必要があります。

ID = Shell("""C:\Program Files\display.exe"" -a -q", , True, 100000)

リテラル文字列で二重引用符が 2 つ連続する (" ") のは、文字列内の 1 つの二重引用符として解釈されます。このため、上の例は次の文字列を Shell 関数に渡しています。

"C:\Program Files\display.exe" -a -q

パスを引用符で囲まない場合、Windows は C:\Program Files ディレクトリの display.exe ではなく、C:\ ディレクトリの Program.exe というファイルを探します。

セキュリティに関するメモ :

ファイル名やパス ノードに空白が含まれる場合は、パスとファイルの指定を引用符で囲まないとセキュリティ上の危険があります。上記の例では、パス ノード \Program Files に空白が含まれます。たとえば不正な方法などにより、Program.exe という名前のプログラムが C:\ にインストールされている場合、ファイルとパスの指定を引用符で囲まないと、Windows は display.exe ではなく、このプログラムを実行します。

セキュリティに関するメモ :

Shell 関数にはアンマネージ コード アクセス許可が必要です。ただし、部分的に信頼されている状況でこの許可を使用すると、プログラムの実行に影響を及ぼす場合があります。詳細については、「SecurityPermission」および「コード アクセス許可」を参照してください。

使用例

Shell 関数を使って、ユーザーが指定したアプリケーションを実行するコード例は、次のとおりです。2 番目の引数に AppWinStyle.NormalFocus を指定することで、アプリケーションは通常のサイズで開き、フォーカスを持ちます。

Dim procID As Integer
' Run calculator.
procID = Shell("C:\Windows\system32\calc.exe", AppWinStyle.NormalFocus)
' The preceding path is for Windows XP.
' The Windows 2000 path is C:\WINNT\system32\calc.exe.

スマート デバイス開発者のためのメモ

この関数はサポートされていません。

必要条件

名前空間 : Microsoft.VisualBasic

モジュール : Interaction

アセンブリ : Visual Basic ランタイム ライブラリ (Microsoft.VisualBasic.dll)

参照

参照

AppWinStyle 列挙型

ArgumentException

FileNotFoundException

NullReferenceException

My.Computer.FileSystem.GetFiles メソッド

AppActivate 関数