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