aodama.gif(0.97KB) 特殊フォルダのパスを取得する

 ここでいう特殊フォルダとは、「スタート メニュー」「送る」「最近使ったファイル」 などの特殊な働きを持ったフォルダのことです。 これらの特殊フォルダのフルパスを取得する方法をいくつか見つけましたので、 すべてご紹介いたします(^^;


その1 - SHGetSpecialFolderLocation, SHGetPathFromIDList

 SHGetSpecialFolderLocation で特殊フォルダの ITEMIDLIST(IDL) を取得し、 その IDL を元に SHGetPathFromIDList でパスを取得できます。 この方法がもっとも一般的で、汎用性の高い方法だと思います。たぶん(^^;

'----- GetSpecialFolderPath -----
'特殊フォルダのパスを返します。
'
'引数   lngFolder
'   パスを取得したいフォルダの CSIDL 定数を指定します。
'
'戻り値
'   成功した場合、特殊フォルダのパスが返ります。
'
Public Function GetSpecialFolderPath(ByVal lngFolder As Long) As String

 Dim lngPIDL As Long     'IDLへのポインタ
 Dim strBuffer As String '特殊フォルダのパスが格納されるバッファ
 
    '結果を受け取るバッファのサイズを設定
    strBuffer = String$(MAX_PATH, vbNullChar)
    
    '特殊フォルダの IDL へのポインタを取得
    If SHGetSpecialFolderLocation(0, lngFolder, lngPIDL) = NOERROR Then
        '取得した IDL へのポインタを使用し、パスを取得
        If SHGetPathFromIDList(lngPIDL, strBuffer) Then
            'NULL文字を取り除いたパスを返す
            GetSpecialFolderPath = TrimNull(strBuffer)
        End If
        Call CoTaskMemFree(lngPIDL)
    End If

End Function

サンプル : ダウンロード s_shget.lzh(3.64KB)



 このサンプルの作成には、Microsoft にあったこのサンプルを参考にしました。

ダウンロード Sfolder.exe(Microsoftのサイト, 自己解凍式アーカイブ, 28.5KB)

 ただしこのサンプルは、プロジェクトファイルのキーが変なので、実行時にエラーが発生します。(^^;
 Project1.vbp をテキストエディタで開いて、4行目の

Reference=*\G{EDCAB942-9F5B-11D1-AFF5-00C04FB9CA23}#1.0#0#..\Customers\Symanski, Find Files\TLB for VB5\maC:\Custo#MyIMalloc

を、

Reference=*\G{EDCAB942-9F5B-11D1-AFF5-00C04FB9CA23}#1.0#0#.\ITMalloc.tlb#MyIMalloc

に書きかえれば実行できるはずです。


その2 - レジストリを参照する

 特殊フォルダのパスは、レジストリの

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
に情報が格納されています。ここを直接参照するという手もありますが、 Windowsの仕様が変更された場合のことを考えると、少し不確実な方法かも・・・(^^;


その3 - SHGetFolderPath

 SHGetFolderPath でも、特殊フォルダのパスを取得できます。 SHGetSpecialFolderLocation では取得できない特殊フォルダ("\Program Files" など)のパスも取得できますが、 どうやら肝心の shfolder.dll はIE4.0以上がインストールされた環境にしか存在しない(らしい)ので、 汎用性については少し怪しいです。

'----- GetFolderPath -----
'引数で指定した特殊フォルダのフルパスを返す。
'
'lngFolder
'   特殊フォルダをCSIDL定数で指定
'
'返値・・・特殊フォルダのフルパス(String)
Public Function GetFolderPath(ByVal lngFolder As Long) As String

 Dim strBuffer As String
 Dim lngRet As Long
 
    strBuffer = String$(MAX_PATH, vbNullChar)
 
    lngRet = SHGetFolderPath(0, lngFolder, 0, SHGFP_TYPE_CURRENT, strBuffer)
    If lngRet = S_OK Then GetFolderPath = TrimNull(strBuffer)

End Function

サンプル : ダウンロード s_shgfp.lzh(4.11KB)

MSDN Library - SHGetFolderPath

その4 - SHGetSpecialFolderPath

 まさにジャストな名称の関数ですが・・・(^^;
 どうやら、Windows 98 がインストールされている環境または、 Windows 95 で IE4.0以上がインストールされており、 なおかつデスクトップがアップデートされている環境の Shell32.dll に存在する関数なので、 動作環境はかなり限定されています。Windows 95 で IE4.0 はインストールしてあるものの、 アクティブ・デスクトップをインストールしていない私の環境では使えませんでした(泣)

 私は使えないのでテストできませんが、宣言はこんな感じでいいと思います(笑)
 nFolder に渡す値は、「その1」のサンプルの CSIDL 定数を参考にして下さい。

Declare Function SHGetSpecialFolderPath Lib "shell32" Alias "SHGetSpecialFolderPathA" _
    (ByVal hwndOwner As Long, _
     ByVal lpszPath As String, _
     ByVal nFolder As Long, _
     ByVal fCreate As Long) As Long
MSDN Library - SHGetSpecialFolderPath


その5 - WshSpecialFolders オブジェクト

 Windows Script Host(以下 WSH) が使用できる環境ならば、 WshSpecialFolders オブジェクトを使用して特殊フォルダのパスを取得できます。
 が、私は WSH についてはど素人ですのでサンプルが書けません(^^;

WshSpecialFolders オブジェクト
SpecialFolders プロパティ


VBコーナーにもどる   トップページにもどる