Win32 APIのShellExecuteEx関数を用いてファイル・フォルダのプロパティを表示する。 SHELLEXECUTEINFO.lpVerb に"properties"を代入することによって、ファイルを実行するのではなく、プロパティを表示することができる。
関数が失敗すると、falseが返されると同時に、SHELLEXECUTEINFO.hInstAppに32以下のエラー値が代入される。 エラー値とその具体的な意味はコード中のSE_ERR〜の定数にある通り。 この例ではSHELLEXECUTEINFO.hWndにIntPtr.Zeroを指定しているが、親ウィンドウが存在する場合はそのウィンドウのハンドルを指定する。
Imports System Imports System.Runtime.InteropServices Namespace SantaMarta.Tips.ShowFilePropertiesDialog Class PropertiesDialog <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto, Pack:=4)> _ Friend Structure SHELLEXECUTEINFO Public cbSize As Integer Public fMask As Integer Public hWnd As IntPtr <MarshalAs(UnmanagedType.LPTStr)> Public lpVerb As String <MarshalAs(UnmanagedType.LPTStr)> Public lpFile As String <MarshalAs(UnmanagedType.LPTStr)> Public lpParameters As String <MarshalAs(UnmanagedType.LPTStr)> Public lpDirectory As String Public nShow As Integer Public hInstApp As IntPtr Public lpIDList As IntPtr <MarshalAs(UnmanagedType.LPTStr)> Public lpClass As String Public hkeyClass As IntPtr Public dwHotKey As Integer Public hIcon As IntPtr Public hProcess As IntPtr End Structure Friend Const SEE_MASK_INVOKEIDLIST As Integer = &HC Friend Const SEE_MASK_NOCLOSEPROCESS As Integer = &H40 Friend Const SEE_MASK_FLAG_NO_UI As Integer = &H400 <DllImport("shell32.dll", EntryPoint:="ShellExecuteEx", CharSet:=CharSet.Auto)> _ Friend Shared Function ShellExecuteEx(ByRef sei As SHELLEXECUTEINFO) As <MarshalAs(UnmanagedType.Bool)> Boolean End Function ''' <summary>ファイルが見つかりません。</summary> Friend Const SE_ERR_FNF As Integer = 2 ''' <summary>パスが見つかりません。</summary> Friend Const SE_ERR_PNF As Integer = 3 ''' <summary>ファイルアクセスが拒否されました。</summary> Friend Const SE_ERR_ACCESSDENIED As Integer = 5 ''' <summary>メモリ不足です。</summary> Friend Const SE_ERR_OOM As Integer = 8 ''' <summary>共有違反が発生しました。</summary> Friend Const SE_ERR_SHARE As Integer = 26 ''' <summary>ファイル関連付けが完全ではないか無効です。</summary> Friend Const SE_ERR_ASSOCINCOMPLETE As Integer = 27 ''' <summary>DDEトランザクションがタイムアウトにより中断されました。</summary> Friend Const SE_ERR_DDETIMEOUT As Integer = 28 ''' <summary>DDEトランザクションが失敗しました。</summary> Friend Const SE_ERR_DDEFAIL As Integer = 29 ''' <summary>他のDDEトランザクションが処理されていたためDDEトランザクションが終了できませんでした。</summary> Friend Const SE_ERR_DDEBUSY As Integer = 30 ''' <summary>ファイル関連付けが不明です。</summary> Friend Const SE_ERR_NOASSOC As Integer = 31 ''' <summary>DLLが見つかりません。</summary> Friend Const SE_ERR_DLLNOTFOUND As Integer = 32 ''' <summary> ''' アプリケーションのメイン エントリ ポイントです。 ''' </summary> Shared Sub Main(ByVal args() As String) ' プロパティを表示する対象のファイル Dim path As String = "C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\devenv.exe" Dim info As SHELLEXECUTEINFO info = New SHELLEXECUTEINFO info.cbSize = Marshal.SizeOf(info) info.fMask = SEE_MASK_NOCLOSEPROCESS Or SEE_MASK_INVOKEIDLIST Or SEE_MASK_FLAG_NO_UI info.hWnd = IntPtr.Zero info.lpFile = path info.lpVerb = "properties" info.lpParameters = "\0" info.lpDirectory = "\0" info.nShow = 0 info.hInstApp = IntPtr.Zero info.lpIDList = IntPtr.Zero info.lpClass = "\0" info.hkeyClass = IntPtr.Zero info.dwHotKey = 0 info.hIcon = IntPtr.Zero info.hProcess = IntPtr.Zero If (ShellExecuteEx(info)) Then Console.WriteLine("成功しました。") Else Console.WriteLine("失敗しました。") End If Console.WriteLine("終了するにはEnterキーを押してください。") Console.ReadLine() End Sub End Class End Namespace_ Friend Structure SHELLEXECUTEINFO Public cbSize As Integer Public fMask As Integer Public hWnd As IntPtrPublic lpVerb As String Public lpFile As String Public lpParameters As String Public lpDirectory As String Public nShow As Integer Public hInstApp As IntPtr Public lpIDList As IntPtr Public lpClass As String Public hkeyClass As IntPtr Public dwHotKey As Integer Public hIcon As IntPtr Public hProcess As IntPtr End Structure Friend Const SEE_MASK_INVOKEIDLIST As Integer = &HC Friend Const SEE_MASK_NOCLOSEPROCESS As Integer = &H40 Friend Const SEE_MASK_FLAG_NO_UI As Integer = &H400 _ Friend Shared Function ShellExecuteEx(ByRef sei As SHELLEXECUTEINFO) As Boolean End Function ''' ファイルが見つかりません。 Friend Const SE_ERR_FNF As Integer = 2 '''パスが見つかりません。 Friend Const SE_ERR_PNF As Integer = 3 '''ファイルアクセスが拒否されました。 Friend Const SE_ERR_ACCESSDENIED As Integer = 5 '''メモリ不足です。 Friend Const SE_ERR_OOM As Integer = 8 '''共有違反が発生しました。 Friend Const SE_ERR_SHARE As Integer = 26 '''ファイル関連付けが完全ではないか無効です。 Friend Const SE_ERR_ASSOCINCOMPLETE As Integer = 27 '''DDEトランザクションがタイムアウトにより中断されました。 Friend Const SE_ERR_DDETIMEOUT As Integer = 28 '''DDEトランザクションが失敗しました。 Friend Const SE_ERR_DDEFAIL As Integer = 29 '''他のDDEトランザクションが処理されていたためDDEトランザクションが終了できませんでした。 Friend Const SE_ERR_DDEBUSY As Integer = 30 '''ファイル関連付けが不明です。 Friend Const SE_ERR_NOASSOC As Integer = 31 '''DLLが見つかりません。 Friend Const SE_ERR_DLLNOTFOUND As Integer = 32 '''''' アプリケーションのメイン エントリ ポイントです。 ''' Shared Sub Main(ByVal args() As String) ' プロパティを表示する対象のファイル Dim path As String = "C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\devenv.exe" Dim info As SHELLEXECUTEINFO info = New SHELLEXECUTEINFO info.cbSize = Marshal.SizeOf(info) info.fMask = SEE_MASK_NOCLOSEPROCESS Or SEE_MASK_INVOKEIDLIST Or SEE_MASK_FLAG_NO_UI info.hWnd = IntPtr.Zero info.lpFile = path info.lpVerb = "properties" info.lpParameters = "\0" info.lpDirectory = "\0" info.nShow = 0 info.hInstApp = IntPtr.Zero info.lpIDList = IntPtr.Zero info.lpClass = "\0" info.hkeyClass = IntPtr.Zero info.dwHotKey = 0 info.hIcon = IntPtr.Zero info.hProcess = IntPtr.Zero If (ShellExecuteEx(info)) Then Console.WriteLine("成功しました。") Else Console.WriteLine("失敗しました。") End If Console.WriteLine("終了するにはEnterキーを押してください。") Console.ReadLine() End Sub End Class End Namespace]]>
using System; using System.Runtime.InteropServices; namespace SantaMarta.Tips.ShowFilePropertiesDialog { class PropertiesDialog { [StructLayout( LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 4 )] internal struct SHELLEXECUTEINFO { public int cbSize; public int fMask; public IntPtr hWnd; [MarshalAs(UnmanagedType.LPTStr)] public string lpVerb; [MarshalAs(UnmanagedType.LPTStr)] public string lpFile; [MarshalAs(UnmanagedType.LPTStr)] public string lpParameters; [MarshalAs(UnmanagedType.LPTStr)] public string lpDirectory; public int nShow; public IntPtr hInstApp; public IntPtr lpIDList; [MarshalAs(UnmanagedType.LPTStr)] public string lpClass; public IntPtr hkeyClass; public int dwHotKey; public IntPtr hIcon; public IntPtr hProcess; } internal const int SEE_MASK_INVOKEIDLIST = 0x000C; internal const int SEE_MASK_NOCLOSEPROCESS = 0x0040; internal const int SEE_MASK_FLAG_NO_UI = 0x0400; [DllImport("shell32.dll", EntryPoint = "ShellExecuteEx", CharSet = CharSet.Auto)] [return: MarshalAs(UnmanagedType.Bool)] internal extern static bool ShellExecuteEx( ref SHELLEXECUTEINFO sei ); /// <summary>ファイルが見つかりません。</summary> internal const int SE_ERR_FNF = 2; /// <summary>パスが見つかりません。</summary> internal const int SE_ERR_PNF = 3; /// <summary>ファイルアクセスが拒否されました。</summary> internal const int SE_ERR_ACCESSDENIED = 5; /// <summary>メモリ不足です。</summary> internal const int SE_ERR_OOM = 8; /// <summary>共有違反が発生しました。</summary> internal const int SE_ERR_SHARE = 26; /// <summary>ファイル関連付けが完全ではないか無効です。</summary> internal const int SE_ERR_ASSOCINCOMPLETE = 27; /// <summary>DDEトランザクションがタイムアウトにより中断されました。</summary> internal const int SE_ERR_DDETIMEOUT = 28; /// <summary>DDEトランザクションが失敗しました。</summary> internal const int SE_ERR_DDEFAIL = 29; /// <summary>他のDDEトランザクションが処理されていたためDDEトランザクションが終了できませんでした。</summary> internal const int SE_ERR_DDEBUSY = 30; /// <summary>ファイル関連付けが不明です。</summary> internal const int SE_ERR_NOASSOC = 31; /// <summary>DLLが見つかりません。</summary> internal const int SE_ERR_DLLNOTFOUND = 32; /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main(string[] args) { // プロパティを表示する対象のファイル string path = @"C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\devenv.exe"; SHELLEXECUTEINFO info; info = new SHELLEXECUTEINFO(); info.cbSize = Marshal.SizeOf(info); info.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_INVOKEIDLIST | SEE_MASK_FLAG_NO_UI; info.hWnd = IntPtr.Zero; info.lpFile = path; info.lpVerb = "properties"; info.lpParameters = "\0"; info.lpDirectory = "\0"; info.nShow = 0; info.hInstApp = IntPtr.Zero; info.lpIDList = IntPtr.Zero; info.lpClass = "\0"; info.hkeyClass = IntPtr.Zero; info.dwHotKey = 0; info.hIcon = IntPtr.Zero; info.hProcess = IntPtr.Zero; if ( ShellExecuteEx( ref info ) ) { Console.WriteLine( "成功しました。" ); } else { Console.WriteLine( "失敗しました。" ); } Console.WriteLine( "終了するにはEnterキーを押してください。" ); Console.ReadLine(); } } }ファイルが見つかりません。 internal const int SE_ERR_FNF = 2; ///パスが見つかりません。 internal const int SE_ERR_PNF = 3; ///ファイルアクセスが拒否されました。 internal const int SE_ERR_ACCESSDENIED = 5; ///メモリ不足です。 internal const int SE_ERR_OOM = 8; ///共有違反が発生しました。 internal const int SE_ERR_SHARE = 26; ///ファイル関連付けが完全ではないか無効です。 internal const int SE_ERR_ASSOCINCOMPLETE = 27; ///DDEトランザクションがタイムアウトにより中断されました。 internal const int SE_ERR_DDETIMEOUT = 28; ///DDEトランザクションが失敗しました。 internal const int SE_ERR_DDEFAIL = 29; ///他のDDEトランザクションが処理されていたためDDEトランザクションが終了できませんでした。 internal const int SE_ERR_DDEBUSY = 30; ///ファイル関連付けが不明です。 internal const int SE_ERR_NOASSOC = 31; ///DLLが見つかりません。 internal const int SE_ERR_DLLNOTFOUND = 32; ////// アプリケーションのメイン エントリ ポイントです。 /// [STAThread] static void Main(string[] args) { // プロパティを表示する対象のファイル string path = @"C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\devenv.exe"; SHELLEXECUTEINFO info; info = new SHELLEXECUTEINFO(); info.cbSize = Marshal.SizeOf(info); info.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_INVOKEIDLIST | SEE_MASK_FLAG_NO_UI; info.hWnd = IntPtr.Zero; info.lpFile = path; info.lpVerb = "properties"; info.lpParameters = "\0"; info.lpDirectory = "\0"; info.nShow = 0; info.hInstApp = IntPtr.Zero; info.lpIDList = IntPtr.Zero; info.lpClass = "\0"; info.hkeyClass = IntPtr.Zero; info.dwHotKey = 0; info.hIcon = IntPtr.Zero; info.hProcess = IntPtr.Zero; if ( ShellExecuteEx( ref info ) ) { Console.WriteLine( "成功しました。" ); } else { Console.WriteLine( "失敗しました。" ); } Console.WriteLine( "終了するにはEnterキーを押してください。" ); Console.ReadLine(); } } }]]>