获取Win95特殊目录准确路径 在Win95中,有许多特殊的目录,如Windows、System、DeskTop、MyDocuments等,这些目录分门别类地 存放着各种不同用途的文件。 在编写Win95下的应用程序时,经常需要获得这些特殊目录的准确路径, 以便正确地存取文件,如:为了将应用程序安装在Program Files目录中,就需要知道该目录的准确路 径。 下面以Visual Basic 5.0为例,介绍在程序中获得Win95特殊目录准确路径的方法。 获取方法 由于VB自身不提供获取Win95特殊目录路径的函数和命令,所以只有求助于Windows API(Windows应用程 序接口,由多个动态链接库组成,提供了大量与系统密切相关的函数)。在Windows API中,与Win95特 殊目录有关的函数有四个,其函数名和功能说明如下: ·GetWindowsDirectory:获得“Win95”目录的 路径; ·GetSystemDirectory:获得“System”目录的路径; ·SHGetSpecialFolderLocation:获得 某个特殊目录在特殊目录列表(该列表记录了所有特殊目录的准确路径)中的位置; · SHGetPathFromIDList:根据某特殊目录在特殊目录列表中的位置获取该目录的准确路径。 可以看出, 除Win95目录和System目录外,其他特殊目录的准确路径都必须通过后两个函数结合使用才能有效地获 取。如:为了获得DeskTop的路径,首先需调用SHGetSpecialFolderLocation获得DeskTop在特殊目录列 表中的位置Pid,然后调用SHGetPathFromIDList函数获得Pid指向的列表内容,即DeskTop的准确路径。 为了在VB中使用Windows API函数,必须在应用程序的代码模块中进行如下函数声明(注意:每条声明语 句应写在一行上): Declare Function GetWindowsDirectory Lib “kernel32” Alias “GetWindowsDirectoryA” (ByVal lpBuffer As String, ByVal nSize As Long) As Long Declare Function GetSystemDirectory Lib “kernel32” Alias “GetSystemDirectoryA” (ByVal lpBuffer As String, ByVal nSize As Long) As Long 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 GetWindowsDirectory和GetSystemDirectory函数的 格式和用法一样,两个参数分别为存放路径的固定长度字符串lpBuffer和该固定长度字符串的长度nSize ,函数返回值为路径的实际长度。 SHGetSpecialFolderLocation函数的第2和第3个参数分别为特殊目录 的整型代号nFolder和特殊目录在特殊文件列表中的位置ppidl(nFolder的部分常用取值和含义见下表 )。SHGetPathFromIDList中的第一个参数pidl为利用上一个函数取回的特殊目录在列表中的位置,第二 个参数szPath为存放路径的字符串。 表1 程序举例 下面建立一个简单的程序,该程序启动后将检测并显示Win95、System和DeskTop三个目录的准确路径。 新建工程GetSysPath,添加一个普通窗体frmGetSysPath.frm,在窗体上绘制三个标签Label1、 Label2和Label3,绘制三个文本框txtWinPath、txtSystemPath和txtDeskTopPath,分别对应Win95、 System和DeskTop三个目录。给工程添加一个代码模块Module1.Bas,在其中添加如下声明: Public Const MAX_LEN = 200 ’字符串最大长度 Public Const DESKTOP = &H0& ’桌面 Public Const PROGRAMS = &H2& ’程序集 Public Const STARTUP = &H7& ’启动 Public Const STARTMENU = &HB& ’开始菜单 Public Const MYDOCUMENTS = &H5& ’My Documents Public Const MYFAVORITES = &H6& ’My Favorites Public Const RECENT = &H8& ’最近打开的文件 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 Declare Function GetWindowsDirectory Lib “kernel32” Alias “GetWindowsDirectoryA” (ByVal lpBuffer As String, ByVal nSize As Long) As Long Declare Function GetSystemDirectory Lib “kernel32” Alias “GetSystemDirectoryA” (ByVal lpBuffer As String, ByVal nSize As Long) As Long 在窗体frmGetSysPath的代码模块中添加 Form_Load事件过程: Private Sub Form_Load() Dim s As String * MAX_LEN '存放结果的固定长度 的字符串 Dim Length As Long '字符串的实际长度 Dim pidl As Long '某特殊目录在特殊目录列表中 的位置 '获得Windows目录 Length = GetWindowsDirectory(s, MAX_LEN) txtWinPath = Left(s, Length) '获得System目录 Length = GetSystemDirectory(s, MAX_LEN) txtSystemPath = Left(s, Length) '获得DeskTop目录,为获得其他特殊目录 '只需改变SHGetSpecialFolderLocation的第二个参 数即可 SHGetSpecialFolderLocation 0, DESKTOP, pidl SHGetPathFromIDList pidl, s xtDeskTopPath = Left(s, InStr(s, Chr(0)) - 1) End Sub 按下F5,运行程序,出现如下画面,可以 看到正确读出的几个特殊目录的准确路径。