这个问题好像已经回答过了:Option Explicit
Private Type ITEMIDLIST
mkid As Long
End Type
Private Declare Function SHGetSpecialFolderLocation _
Lib "shell32.dll" _
(ByVal hwndOwner As Long, ByVal nFolder As SHFolders, _
ppidl As ITEMIDLIST) As Long
Private Declare Sub CoTaskMemFree Lib "ole32.dll" _
(ByVal pv As Long)
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" _
Alias "SHGetPathFromIDListA" (ByVal pidl As Long, _
ByVal pszPath As String) As Long
Public Enum SHFolders
CSIDL_DESKTOP = & H0
CSIDL_INTERNET = & H1
CSIDL_PROGRAMS = & H2
CSIDL_CONTROLS = & H3
CSIDL_PRINTERS = & H4
CSIDL_PERSONAL = & H5
CSIDL_FAVORITES = & H6
CSIDL_STARTUP = & H7
CSIDL_RECENT = & H8
CSIDL_SENDTO = & H9
CSIDL_BITBUCKET = & HA
CSIDL_STARTMENU = & HB
CSIDL_DESKTOPDIRECTORY = & H10
CSIDL_DRIVES = & H11
CSIDL_NETWORK = & H12
CSIDL_NETHOOD = & H13
CSIDL_FONTS = & H14
CSIDL_TEMPLATES = & H15
CSIDL_COMMON_STARTMENU = & H16
CSIDL_COMMON_PROGRAMS = & H17
CSIDL_COMMON_STARTUP = & H18
CSIDL_COMMON_DESKTOPDIRECTORY = & H19
CSIDL_APPDATA = & H1A
CSIDL_PRINTHOOD = & H1B
CSIDL_ALTSTARTUP = & H1D '// DBCS
CSIDL_COMMON_ALTSTARTUP = & H1E '// DBCS
CSIDL_COMMON_FAVORITES = & H1F
CSIDL_INTERNET_CACHE = & H20
CSIDL_COOKIES = & H21
CSIDL_HISTORY = & H22
End Enum
Private Function FolderLocation(lFolder As SHFolders) As String
Dim lp As ITEMIDLIST
Dim tmpStr As String
'Get the PIDL for this folder
SHGetSpecialFolderLocation hWnd, lFolder, lp
'Convert it to a string path
tmpStr = Space$(255)
SHGetPathFromIDList lp.mkid, tmpStr
If InStr(tmpStr, Chr$(0)) > 0 Then
'Strip nulls from the string
tmpStr = Left$(tmpStr, InStr(tmpStr, Chr$(0)) - 1)
End If
'Free the PIDL
CoTaskMemFree lp.mkid
'Return
FolderLocation = tmpStr
End Function
Private Sub cmdGet_Click()
If lst.ListIndex < 0 Then
'No item selected
Exit Sub
End If
txt.Text = FolderLocation(lst.ItemData(lst.ListIndex))
End Sub其中CSIDL_DESKTOP、 CSIDL_PERSONAL 分别代表桌面路径以及我的文档的目录
Private Type ITEMIDLIST
mkid As Long
End Type
Private Declare Function SHGetSpecialFolderLocation _
Lib "shell32.dll" _
(ByVal hwndOwner As Long, ByVal nFolder As SHFolders, _
ppidl As ITEMIDLIST) As Long
Private Declare Sub CoTaskMemFree Lib "ole32.dll" _
(ByVal pv As Long)
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" _
Alias "SHGetPathFromIDListA" (ByVal pidl As Long, _
ByVal pszPath As String) As Long
Public Enum SHFolders
CSIDL_DESKTOP = & H0
CSIDL_INTERNET = & H1
CSIDL_PROGRAMS = & H2
CSIDL_CONTROLS = & H3
CSIDL_PRINTERS = & H4
CSIDL_PERSONAL = & H5
CSIDL_FAVORITES = & H6
CSIDL_STARTUP = & H7
CSIDL_RECENT = & H8
CSIDL_SENDTO = & H9
CSIDL_BITBUCKET = & HA
CSIDL_STARTMENU = & HB
CSIDL_DESKTOPDIRECTORY = & H10
CSIDL_DRIVES = & H11
CSIDL_NETWORK = & H12
CSIDL_NETHOOD = & H13
CSIDL_FONTS = & H14
CSIDL_TEMPLATES = & H15
CSIDL_COMMON_STARTMENU = & H16
CSIDL_COMMON_PROGRAMS = & H17
CSIDL_COMMON_STARTUP = & H18
CSIDL_COMMON_DESKTOPDIRECTORY = & H19
CSIDL_APPDATA = & H1A
CSIDL_PRINTHOOD = & H1B
CSIDL_ALTSTARTUP = & H1D '// DBCS
CSIDL_COMMON_ALTSTARTUP = & H1E '// DBCS
CSIDL_COMMON_FAVORITES = & H1F
CSIDL_INTERNET_CACHE = & H20
CSIDL_COOKIES = & H21
CSIDL_HISTORY = & H22
End Enum
Private Function FolderLocation(lFolder As SHFolders) As String
Dim lp As ITEMIDLIST
Dim tmpStr As String
'Get the PIDL for this folder
SHGetSpecialFolderLocation hWnd, lFolder, lp
'Convert it to a string path
tmpStr = Space$(255)
SHGetPathFromIDList lp.mkid, tmpStr
If InStr(tmpStr, Chr$(0)) > 0 Then
'Strip nulls from the string
tmpStr = Left$(tmpStr, InStr(tmpStr, Chr$(0)) - 1)
End If
'Free the PIDL
CoTaskMemFree lp.mkid
'Return
FolderLocation = tmpStr
End Function
Private Sub cmdGet_Click()
If lst.ListIndex < 0 Then
'No item selected
Exit Sub
End If
txt.Text = FolderLocation(lst.ItemData(lst.ListIndex))
End Sub其中CSIDL_DESKTOP、 CSIDL_PERSONAL 分别代表桌面路径以及我的文档的目录
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货