GetSPFolderPath

My Documents やデスクトップなど、特殊フォルダの物理的フルパスを取得するための関数です。
Windows2000 などでは、ユーザー毎にシステムフォルダのパスが異なったりするので、
勝手に "C:\My Documents" などと決めず、この関数を用いて取得しましょう。
なお、Windows フォルダや System フォルダを取得したい場合はこちらを参照してください。

'標準モジュールに記述します。

Option Explicit

'OS が管理する特殊フォルダのItemIDListのポインタを取得する
Private Declare Function SHGetSpecialFolderLocation Lib "Shell32" _
(ByVal hwndOwner As Long, ByVal nFolder As Long, ppidl As Long) As Long

'ItemIDList のポインタからフォルダの名前を取得する
Private Declare Function SHGetPathFromIDList Lib "Shell32" _
(ByVal pidl As Long, ByVal pszPath As String) As Long

'タスクメモリブロックを解放する
Private Declare Sub CoTaskMemFree Lib "Ole32" (ByVal pv As Long)

'ID の値
Public Enum IDL_LIST
    CSIDL_DESKTOP = &H0                     '\デスクトップフォルダ
    CSIDL_PROGRAMS = &H2                    '\プログラムグループ
    CSIDL_PERSONAL = &H5                    '\My Doucutents
    CSIDL_FAVORITES = &H6                   '\お気に入り
    CSIDL_STARTUP = &H7                     '\スタートアップ
    CSIDL_RECENT = &H8                      '\最近使ったファイル
    CSIDL_SENDTO = &H9                      '\送る
    CSIDL_STARTMENU = &HB                   '\スタートメニュー
    CSIDL_DESKTOPDIRECTORY = &H10           '\デスクトップディレクトリ
    CSIDL_NETHOOD = &H13                    '\NetHood
    CSIDL_FONTS = &H14                      '\フォント
    CSIDL_TEMPLATES = &H15                  '\テンプレート
    CSIDL_COMMON_STARTMENU = &H16           '\All User スタートメニュー
    CSIDL_COMMON_PROGRAMS = &H17            '\All User プログラムグループ
    CSIDL_COMMON_STARTUP = &H18             '\All User スタートアップ
    CSIDL_COMMON_DESKTOPDIRECTORY = &H19    '\All User デスクトップ
    CSIDL_APPDATA = &H1A                    '\アプリ定義データ用共通フォルダ
    CSIDL_PRINTHOOD = &H1B                  '\プリンタリンク
    CSIDL_COMMON_FAVORITES = &H1F           '\All User お気に入り
    CSIDL_INTERNET_CACHE = &H20             '\IEのキャッシュ
    CSIDL_COOKIES = &H21                    '\クッキー用フォルダ
    CSIDL_HISTORY = &H22                    '\IEの履歴

'    CSIDL_INTERNET = &H1                    'Virtual folder representing the Internet.
'    CSIDL_CONTROLS = &H3                    'Virtual folder containing icons for the Control Panel applications.
'    CSIDL_PRINTERS = &H4                    'Virtual folder containing installed printers.
'    CSIDL_BITBUCKET = &HA                   'Virtual folder containing the objects in the user's Recycle Bin.
'    CSIDL_DRIVES = &H11                     'My Computer - virtual folder containing everything on the local computer:
'                                            'storage devices, printers, and Control Panel.
'                                            'The folder may also contain mapped network drives.
'    CSIDL_NETWORK = &H12                    'Network Neighborhood - virtual folder representing
'                                            'the root of the network namespace hierarchy.
'    CSIDL_ALTSTARTUP = &H1D                 'File system directory that corresponds to the user's nonlocalized Startup program group.
'    CSIDL_COMMON_ALTSTARTUP = &H1E          'File system directory that corresponds to the nonlocalized Startup program group
                                             'for all users. Valid only for Windows NT(R) systems.
End Enum

Private Const MAX_PATH = 260

Public Function GetSPFolderPath(ItemID As IDL_LIST) As String
'機能
'   特殊フォルダのフルパスを取得します
'引数
'   ItemID : 特殊フォルダを表す ID (インテリセンスが機能します)
'戻り値
'   特殊フォルダのフルパス名(文字列)

    Dim lngRet As Long      'API からの戻り値
    Dim pidlFolder As Long  'ItemIDList のポインタ ( pidl )
    Dim strBuf As String    '文字列を受け取るバッファ

    'pidl 取得
    lngRet = SHGetSpecialFolderLocation(0, ItemID, pidlFolder)

    If lngRet >= 0 Then
        '文字列のバッファ確保
        strBuf = String$(MAX_PATH, vbNullChar)

        'pidl からフルパス取得
        If SHGetPathFromIDList(pidlFolder, strBuf) <> 0 Then
            '余った部分の不要なヌル文字を除去
            strBuf = Left$(strBuf, InStr(strBuf, vbNullChar) - 1)
        Else
            '取得に失敗した場合は空文字を返す
            strBuf = ""
        End If
        '後始末
        CoTaskMemFree pidlFolder

        GetSPFolderPath = strBuf
    End If

End Function

実行例:

'イミディエイトウィンドウでの実行例です。

?GetSPFolderPath(CSIDL_PERSONAL)
C:\Documents and Settings\lionel\My Documents

戻る