Office中国论坛/Access中国论坛

标题: 【源码】VBA获取系统环境变量及特殊文件夹的各种代码与方法 [打印本页]

作者: tmtony    时间: 2015-4-1 22:25
标题: 【源码】VBA获取系统环境变量及特殊文件夹的各种代码与方法
这几天帮客户做个系统,需要获到系统环境变量及一些特殊文件夹。收集和研究了各种代码。记录一下,以免自己忘记,同时也分享一下给大家,避免大家遇到同样问题时,再去花费大量时间。

一、我个人整理出来的一些心得和经验:

1.Environ("AllUsersProfile")   在XP下  获取的是   C:\Documents and Settings\All Users
   在win7 win8下获取的是  
   C:\ProgramData
   有所不同,这个差异请注意

2.XP 与win7 大多的变量 是可以对应的,但也有些是对应不到的


环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。
环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程。


二、常用windows系统环境变量清单


设置环境变量有两种方式:第一种是在命令提示符运行窗口中设置;第二种是通过单击“我的电脑→属性→高级”标签的“环境变量”按钮设置。需要注意的是,第一种设置环境变量的方式只对当前运行窗口有效,关闭运行窗口后,设置就不起作用了,而第二种设置环境变量的方式则是永久有效。
  2.如何在命令提示符窗口中设置环境变量?
  在“开始→运行”框中输入“cmd”后按“确定”按钮,出现命令运行窗口。在命令提示符下输入“set”即可查看环境变量设置。要查看具体某个环境变量的设置,比如要查看path环境变量的设置,可以输入“set path”。要创建一个环境变量,比如要创建一个名为aa的,值为“c:”的环境变量,可以输入“set aa=c:”命令。而要删除一个环境变量,比如要删除aa环境变量,则可输入“set aa=”命令(注意=后面不能有空格)。如何更改一个环境变量的设置呢?更改环境变量有两种情况:一是追加方式,即在不改变环境变量现有设置的情况下,增加变量的值,比如要给环境变量aa增加一个值为“D:”的设置,可以输入“set aa=%path%;D:”。另一种是完全修改方式,对于这种方式,我们可以采用直接创建一个环境变量的方法来实现。
  3.用户变量和系统变量的关系是什么?
  点击“我的电脑→属性→高级”标签的“环境变量”按钮,出现“环境变量”对话框,如果当前是以Administrator登录系统的用户,对话框的上面为Administrator的用户变量,对话框的下面为系统变量(即相当于系统中所有用户的用户变量)。有的时候我们会看到在用户变量和系统变量中都存在某一个环境变量,比如path,那么path的值到底是用户变量中的值还是系统变量中的值,或者两者都不是呢?答案是两者都不是。path变量的值是用户变量中的值与系统变量中的值的叠加。
  4.改变环境变量和环境变量中的值应该注意什么?
  环境变量和环境变量的值不要含有空格,也不要用中文,切记!

     更全的环境变量来一个

   WINDOWS系统




三、更详细的VB Environ系统环境变量函数大全(同样支持Access Excel word outlook ppt等 这些VBA环境):







作者: tmtony    时间: 2015-4-1 22:27
其它相关资料

函数原型:
WINSHELLAPI HRESULT WINAPI SHGetSpecialFolderLocation(
  HWND hwndOwner,
  int nFolder,
  LPITEMIDLIST* ppidl
);

函数功能:
该函数获取一个特殊的文件夹的位置,比如我的电脑,回收站,台式机,打印机,字体,或各种文件系统的目录。

函数参数:
hwndOwner
处理的所有者窗口的客户端应该指定是否显示一个对话框或消息框。

nFolder
值,指定要检索的位置的文件夹。下表列出了可能的值。
它充当应用程序特定数据的公共储存库CSIDL_APPDATA的文件系统目录。
包含在用户的回收站文件对象CSIDL_BITBUCKET的文件系统目录。此目录的位置是不是在注册表中,它被标记为隐藏和系统属性,以防止用户移动或删除它。
CSIDL_CONTROLS不支持。
包含桌面项目CSIDL_DESKTOP虚拟文件夹。这是在虚拟的命名空间的根文件夹。
用于桌面(不要与桌面文件夹本身混淆)上的物理存储文件对象CSIDL_DESKTOPDIRECTORY的文件系统目录。
CSIDL_DRIVES我的电脑,这是一个包含一切的本地计算机上的虚拟文件夹:存储设备和打印机。该文件夹可能还包含映射的网络驱动器。
它充当用户的喜爱项的公共储存库CSIDL_FAVORITES的文件系统目录。
CSIDL_FONTS虚拟包含文件夹的字体。
CSIDL_NETHOOD不支持。
CSIDL_NETWORK网上邻居文件夹,这是代表网络层次结构的顶层虚拟文件夹。
用作文档的公共储存库CSIDL_PERSONAL的文件系统目录。
CSIDL_PRINTERS不支持。
CSIDL_PROFILE文件夹包含用户的个人资料。
CSIDL_PROGRAM_FILES Program Files文件夹。
包含用户程序组(同时亦文件系统目录) CSIDL_PROGRAMS的文件系统目录。
包含用户最近使用过的文档CSIDL_RECENT的文件系统目录。
CSIDL_SENDTO不支持。
包含开始菜单项目CSIDL_STARTMENU的文件系统目录。
对应于用户的启动程序组CSIDL_STARTUP文件系统目录。在系统启动这些程序时,设备上电。
CSIDL_TEMPLATES不支持。
CSIDL_WINDOWS Windows文件夹。

ppidl
指向一个LPITEMIDLIST结构

函数返回:
NOERROR表示成功。一个OLE定义的错误结果表明失败。

易语言声明:
.DLL命令 API_SHGetSpecialFolderLocation, , "shell32.dll", "SHGetSpecialFolderLocation",  
    .参数 hwnd, 整数型, ,
    .参数 csidl, 整数型, ,
    .参数 ppidl, ITEMIDLIST, ,

VB声明:
Declare Sub SHGetSpecialFolderLocation Lib "shell32.dll" (ByVal hwnd As Long, ByVal csidl As Long, ByRef ppidl As ITEMIDLIST)
使用方法:
下面以在VC中使用为例来获取桌面路径,代码如下: 本文来Love代码 www.lvcode.com
LPITEMIDLIST ppidl;
char lpsbuf[255];
SHGetSpecialFolderLocation(NULL,CSIDL_DESKTOP   ,&ppidl);
SHGetPathFromIDList(ppidl,lpsbuf);
MessageBox(lpsbuf);

在其它语言中用法类似,由于其它语言需要声明结构就不演示了,按照上面的语法即可获取相应的路径了,路径的说明请看函数的nFolder参数说明!
作者: tmtony    时间: 2015-4-1 22:28
如何用VB获得Windows各类系统目录

现在有很多关于如何用VB获得Windows目录的文章,但大都只讲到如何获得Windows目录和System目录,有时候我们却需要获得像"我的文档"这样的目录("我的文档"的路径并不是固定的,可以由自己设定,也有可能因为系统的安装路径不同而不同),那又该如何处理呢?下面我们来具体谈谈如何用VB获得这种路径。
一、先向大家介绍两个API函数,这两个函数分别是SHGetSpecialFolderLocation和SHGetPathFromIDList      这就是我们用来获得各种路径的武器。
     函数声明:

  1. Private Declare Function SHGetSpecialFolderLocation Lib "Shell32" (ByVal hwndOwner As Long, ByVal nFolder As Integer, ppidl As Long) As Long
  2. Private Declare Function SHGetPathFromIDList Lib "Shell32" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal szPath As String) As Long
复制代码

     函数功能及参数说明:

SHGetSpecialFolderLocation:获得某个特殊目录在特殊目录列表中的位置;它有三个参数,第一个参数是用来指定所有者窗口的,在应用中一般我们写上"0"就可以了;第二个参数是一个整数id,它决定要查找的目录是哪一个目录,它的取值可能如下:

  1. &H0& '桌面
  2. &H2& '程序集
  3. &H5& '我的文档
  4. &H6& '收藏夹
  5. &H7& '启动
  6. &H8& '最近打开的文件
  7. &H9& '发送
  8. &HB& '开始菜单
  9. &H13& '网上邻居
  10. &H14& '字体
  11. &H15& 'ShellNew
  12. &H1A& 'Application Data
  13. &H1B& 'PrintHood
  14. &H20& '网页临时文件
  15. &H21& 'Cookies目录
  16. &H22& '历史
复制代码

第三个参数是获得的特殊目录在特殊目录列表中的地址。

SHGetPathFromIDList:根据某特殊目录在特殊目录列表中的地址获取该目录的准确路径。它有两个参数,第一个参数是特殊目录在特殊目录列表中的地址,也即上一个函数所获得的地址;第二个参数是一个字符串型数据,用来保存返回的特殊目录的准确路径。
比如:为了获得DeskTop的路径,首先需调用SHGetSpecialFolderLocation获得DeskTop在特殊目录列表中的位置Pid,然后调用SHGetPathFromIDList函数获得Pid指向的列表内容,即DeskTop的准确路径。

二、一个用来获取Windows各种目录路径的例子如下:


  1. Private Declare Function SHGetSpecialFolderLocation Lib "Shell32" (ByVal hwndOwner As Long, ByVal nFolder As Integer, ppidl As Long) As Long
  2. Private Declare Function SHGetPathFromIDList Lib "Shell32" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal szPath As String) As Long
  3. Private Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
  4. Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
  5. Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
  6. Const MAX_LEN = 200 '字符串最大长度
  7. Const DESKTOP = &H0& '桌面
  8. Const PROGRAMS = &H2& '程序集
  9. Const MYDOCUMENTS = &H5& '我的文档
  10. Const MYFAVORITES = &H6& '收藏夹
  11. Const STARTUP = &H7& '启动
  12. Const RECENT = &H8& '最近打开的文件
  13. Const SENDTO = &H9& '发送
  14. Const STARTMENU = &HB& '开始菜单
  15. Const NETHOOD = &H13& '网上邻居
  16. Const FONTS = &H14& '字体
  17. Const SHELLNEW = &H15& 'ShellNew
  18. Const APPDATA = &H1A& 'Application Data
  19. Const PRINTHOOD = &H1B& 'PrintHood
  20. Const PAGETMP = &H20& '网页临时文件
  21. Const COOKIES = &H21& 'Cookies目录
  22. Const HISTORY = &H22& '历史

  23. Private Sub Command2_Click()
  24. End
  25. End Sub

  26. Private Sub Form_Load()
  27. Dim sTmp As String * MAX_LEN '存放结果的固定长度的字符串
  28. Dim nLength As Long '字符串的实际长度
  29. Dim pidl As Long '某特殊目录在特殊目录列表中的位置

  30. '*************************获得Windows目录**********************************
  31. Length = GetWindowsDirectory(sTmp, MAX_LEN)
  32. Debug.Print Left(sTmp, Length)

  33. '*************************获得System目录***********************************
  34. Length = GetSystemDirectory(sTmp, MAX_LEN)
  35. Debug.Print Left(sTmp, Length)

  36. '*************************获得Temp目录***********************************
  37. Length = GetTempPath(MAX_LEN, sTmp)
  38. Debug.Print Left(sTmp, Length)

  39. '*************************获得DeskTop目录**********************************
  40. SHGetSpecialFolderLocation 0, DESKTOP, pidl
  41. SHGetPathFromIDList pidl, sTmp
  42. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  43. '*************************获得发送到目录**********************************
  44. SHGetSpecialFolderLocation 0, SENDTO, pidl
  45. SHGetPathFromIDList pidl, sTmp
  46. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  47. '*************************获得我的文档目录*********************************
  48. SHGetSpecialFolderLocation 0, MYDOCUMENTS, pidl
  49. SHGetPathFromIDList pidl, sTmp
  50. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  51. '*************************获得程序集目录***********************************
  52. SHGetSpecialFolderLocation 0, PROGRAMS, pidl
  53. SHGetPathFromIDList pidl, sTmp
  54. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  55. '*************************获得启动目录*************************************
  56. SHGetSpecialFolderLocation 0, STARTUP, pidl
  57. SHGetPathFromIDList pidl, sTmp
  58. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  59. '*************************获得开始菜单目录*********************************
  60. SHGetSpecialFolderLocation 0, STARTMENU, pidl
  61. SHGetPathFromIDList pidl, sTmp
  62. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  63. '*************************获得收藏夹目录***********************************
  64. SHGetSpecialFolderLocation 0, MYFAVORITES, pidl
  65. SHGetPathFromIDList pidl, sTmp
  66. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  67. '**********************获得最后打开的文件目录*******************************
  68. SHGetSpecialFolderLocation 0, RECENT, pidl
  69. SHGetPathFromIDList pidl, sTmp
  70. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  71. '*************************获得网上邻居目录*********************************
  72. SHGetSpecialFolderLocation 0, NETHOOD, pidl
  73. SHGetPathFromIDList pidl, sTmp
  74. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  75. '*************************获得字体目录**********************************
  76. SHGetSpecialFolderLocation 0, FONTS, pidl
  77. SHGetPathFromIDList pidl, sTmp
  78. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  79. '*************************获得Cookies目录**********************************
  80. SHGetSpecialFolderLocation 0, COOKIES, pidl
  81. SHGetPathFromIDList pidl, sTmp
  82. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  83. '*************************获得历史目录**********************************
  84. SHGetSpecialFolderLocation 0, HISTORY, pidl
  85. SHGetPathFromIDList pidl, sTmp
  86. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  87. '***********************获得网页临时文件目录*******************************
  88. SHGetSpecialFolderLocation 0, PAGETMP, pidl
  89. SHGetPathFromIDList pidl, sTmp
  90. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  91. '*************************获得ShellNew目录*********************************
  92. SHGetSpecialFolderLocation 0, SHELLNEW, pidl
  93. SHGetPathFromIDList pidl, sTmp
  94. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  95. '***********************获得Application Data目录*****************************
  96. SHGetSpecialFolderLocation 0, APPDATA, pidl
  97. SHGetPathFromIDList pidl, sTmp
  98. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)

  99. '*************************获得PrintHood目录*********************************
  100. SHGetSpecialFolderLocation 0, PRINTHOOD, pidl
  101. SHGetPathFromIDList pidl, sTmp
  102. Debug.Print Left(sTmp, InStr(sTmp, Chr(0)) - 1)
  103. End Sub
复制代码




作者: 闻启学    时间: 2015-4-1 23:17
多谢分享哦
作者: zpy2    时间: 2015-4-2 04:16
多谢分享 好象Fso里 specialfold也有类似的 但没那么全
作者: 好运牛    时间: 2015-4-4 17:58
无私奉献,谢谢分享
作者: hongyin    时间: 2015-4-7 08:27
谢谢分享!




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3