NonSoft

拡張子に関連づいたEXEのPATHを
取得するサンプル(VB.NET)


 サンプル(ソース/コード)
<このサンプルの概要>
拡張子に関連づいたEXE(アプリケーション)のPATHを取得するサンプル(VB.NET)です。

拡張子に関連づいたAPのPATHを取得するためにはレジストリから情報を取得する必要があります。
関連付けの情報はシステムが持っている情報とエクスプローラが持っている情報があります。
通常は、エクスプローラが持っている関連付けの情報でファイルを開きたいと思いますので、
このサンプルでも、まずエクスプローラが持っている関連付けの情報を検索し、見つからない時に
システムが持っている関連付けの情報を検索します。

システムが持っている関連付けの情報ですとテキストエディタはメモ帳です。

C#.NET版はこちらです。
拡張子に関連づいたEXEのPATHを取得するサンプル(C#.NET)

VB6版はこちらです。
拡張子に関連づいたEXEのPATHを取得するサンプル(VB6)

このサンプルは以下のようなフォルダ関係やファイル関係のツールで使用されています。
フォルダ内のファイル比較ツール
テキスト差分表示ツール
フォルダ監視人

★フォームモジュール(Form1.vb)
Private Sub Button1_Click( _
    ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    MessageBox.Show(GetExtApPath("C:\Temp\Text.txt"))
End Sub

''' <summary>
''' 拡張子に関連づいたアプリケーションのPATH取得(引数PATH付き)
''' </summary>
''' <param name="fpath">ファイルPATH(拡張子付き)</param>
''' <returns>コマンドライン</returns>
Private Function GetExtApPath(ByVal fpath As String) As String
    Dim ext As String = IO.Path.GetExtension(fpath)
    If ext.Substring(0, 1) <> "." Then ext = "." & ext

    Dim strCmd As String = ""
    Dim strApp As String = ""
    Dim regKey As Microsoft.Win32.RegistryKey

    Try
        ' 拡張子に関連づいたアプリケーションのPATH取得(エクスプローラ編)
        regKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(String.Format( _
            "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\{0}", ext))
        If regKey Is Nothing = False Then
            strApp = CStr(regKey.GetValue("Application"))
            regKey.Close()
        End If

        If strApp = "" Then
            ' アプリケーションが見つけられなかった場合はOpenWithListから探す
            regKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(String.Format( _
            "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\{0}\OpenWithList", _
            ext))
            If regKey Is Nothing = False Then
                Dim mruList As String = CStr(regKey.GetValue("MRUList"))
                strApp = CStr(regKey.GetValue(mruList.Substring(0, 1)))
                regKey.Close()
            Else
                ' 拡張子に関連づいたアプリケーションのPATH取得(システム編)
                Throw New Exception
            End If
        End If

        If strApp <> "" Then
            ' アプリケーションのPATH取得
            regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(String.Format( _
                "Applications\{0}\shell\open\command", strApp))
            If regKey Is Nothing = False Then
                strCmd = CStr(regKey.GetValue(""))
                regKey.Close()
            Else
                ' 拡張子に関連づいたアプリケーションのPATH取得(システム編)
                Throw New Exception
            End If
        Else
            ' 拡張子に関連づいたアプリケーションのPATH取得(システム編)
            Throw New Exception
        End If

    Catch
        Try
            ' 拡張子に関連づいたアプリケーションのPATH取得(システム編)
            regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext)
            If regKey Is Nothing = False Then
                Dim fileType As String = CStr(regKey.GetValue(""))
                regKey.Close()

                ' アプリケーションのPATH取得
                regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(String.Format( _
                    "{0}\shell\open\command", fileType))
                If regKey Is Nothing = False Then
                    strCmd = CStr(regKey.GetValue(""))
                    regKey.Close()
                End If
            End If
        Catch
        End Try
    End Try

    ' コマンドラインの引数部分に指定のファイルPATHを設定
    strCmd = strCmd.Replace("""%1""", """" & fpath & """")
    strCmd = strCmd.Replace("%1", """" & fpath & """")
    Return strCmd
End Function