VBA设置用户环境变量¶
发布于:2017-11-25 | 分类:python/vba/cpp
问题来源于一个实际应用场景:VBA调用C++动态链接库,该链接库使用QtNetwork
发起Https请求和获取响应数据。
问题描述¶
假设自定义的动态链接库为test.dll
,则test.dll
依赖于Qt5Core.dll
、Qt5Network.dll
等Qt模块链接库,而Qt5Network.dll
则需要SSL支持即依赖于libeay32.dll
和ssleay32.dll
。
部署阶段,Qt5Core.dll
和Qt5Network.dll
显然必须位于test.dll
的同级目录下;而将libeay32.dll
和ssleay32.dll
放在该目录则不起作用。
猜测原因:系统搜索libeay32.dll
和ssleay32.dll
的目录是系统路径或者调用者即Qt5Network.dll
所在目录,而当前所在的只是test.dll
的目录。虽然Qt5Network.dll
也在当前目录,但它却是作为test.dll
的依赖库被查找到的,系统并不直接识别当前目录下的Qt5Network.dll
。
直接的解决方法为将libeay32.dll
和ssleay32.dll
保存于系统路径,例如32-bit的C:\Windows\System32
或64-bit的C:\Windows\SysWOW64
。但是,此方法对不具备管理员权限的用户无效(毕竟工作中使用的电脑不一定具备管理员权限)。那么,考虑将当前目录添加到系统搜索路径即path
环境变量中。虽然不具备管理员权限,我们却可以设置 用户环境变量。
VBA示例¶
对于不具备管理员权限的用户,管理用户环境变量的操作流程:控制面板
->用户账户
->用户账户
->更改我的环境变量
。
Dim objUserEnv As Object, strPath$, strNewPath$
Set objUserEnv = createObject("WScript.Shell").Environment("User")
strNewPath = "path/to/be/added"
strPath = objUserEnv.Item("path") ' 获取
objUserEnv.Item("path") = strPath & ";" & strNewPath ' 设置
另外,如果只是获取环境变量(包括系统环境变量),可以使用:
' 综合系统path变量路径及用户path变量路径
strPath = Environ("path")
命令行设置临时环境变量¶
set
可以设置临时环境变量,即仅在当前命令窗口生效
rem 显示path环境变量
set path
rem 设置空值即删除环境变量
set path=
rem 在path环境变量内容之前添加路径new/path
set path="%path% new/path;"
命令行设置永久环境变量¶
setx
设置永久的环境变量,并且可以设置用户/系统环境变量,十分适用于不具备管理员权限的用户。注意,setx
设置的环境变量将在下次打开命令窗口时生效。
rem 设置当前用户的环境变量
setx ENV_NAME env_value
rem 设置系统环境变量
set ENV_NAME env_value /m
rem 设置空值即删除环境变量
setx ENV_NAME ""
直接设置系统环境变量可能会遇到如下错误提示:
C:\Users\TRAIN>setx TRAIN 123 /m
错误: 拒绝访问注册表路径。
这时需要启用具备系统管理员权限的终端,以Win10
为例,右键左下角开始菜单,选择“Windows PowerShell(管理员)”即可。