我们可以利用 GetWindowsDirectory API 函数取得 Windows 的所在目录,延续这个问题,如果我们想取得「桌面」、「开始菜单」、「程序」、「启动」…等特殊文件夹的所在目录呢? 假设 Windows 的所在目录是 C:\Windows, 那么可能有人认为以下目录就是上述特殊文件夹的所在目录:
所在目录 | 特殊文件夹 |
C:\Windows\Desktop | 桌面 |
C:\Windows\Start Menu | 开始菜单 |
C:\Windows\Start Menu\Programs | 程序 |
C:\Windows\Start Menu\Programs\启动 | 启动 |
但实际上这个想法在以下几种情况却可能是错误的:
Windows版本不同时: 举例来说, 英文版Windows「启动」文件夹的默认目录是C:\Windows\Start Menu\Programs\Startup, Windows NT 4.0 中文版「桌面」文件夹的默认目录是C:\Windows\桌面。
使用者改变了上述特殊文件夹的所在目录:实际上Windows允许使用者依据自己的喜好改变上述特殊文件夹的所在目录。
要正确地取得特殊文件夹的所在目录,可调用 SHGetSpecialFolderLocation 及 SHGetPathFromIDList API 函数,细节如下:
1. API 的定义:
Const MAX_PATH = 260
Const CSIDL_DESKTOP = &H0& '桌面
Const CSIDL_PROGRAMS = &H2& '程序
Const CSIDL_STARTUP = &H7& '启动
Const CSIDL_STARTMENU = &HB& '开始菜单
Const CSIDL_DESKTOPDIRECTORY = &H10& '桌面
Const CSIDL_PERSONAL = &H5& 'My Documents
Const CSIDL_FAVORITES = &H6& '我的最爱
Const CSIDL_RECENT = &H8& '文件(最近开启)
Const CSIDL_SENDTO = &H9& '传送至
Const CSIDL_NETHOOD = &H13& 'NetHood
Const CSIDL_FONTS = &H14& '字型
Const CSIDL_TEMPLATES = &H15& 'ShellNew
Declare Function SHGetSpecialFolderLocation Lib "Shell32"
(ByVal hwndOwner As Long, ByVal nFolder As Integer, ppidl As Long) As Long
Declare Function SHGetPathFromIDList Lib "Shell32" Alias "SHGetPathFromIDListA"
(ByVal pidl As Long, ByVal szPath As String) As Long
注:如果以上的定义放在「一般模组」底下, 应在 Const
之前加上 Public 保留字, 并且将 Private 保留字去掉。
2. 调用例:
Const MAX_PATH = 260 Dim pidl As Long, S As String Id = CSIDL_DESKTOP ' 「桌面」文件夹 S = String(MAX_PATH, 0) SHGetSpecialFolderLocation 0, Id, pidl SHGetPathFromIDList pidl, S S = Left(S, InStr(S, Chr(0)) - 1) ' S 等于「桌面」的所在目录