VBA设置用户环境变量

发布于:2017-11-25 | 分类:python/vba/cpp


问题来源于一个实际应用场景:VBA调用C++动态链接库,该链接库使用QtNetwork发起Https请求和获取响应数据。

问题描述

假设自定义的动态链接库为test.dll,则test.dll依赖于Qt5Core.dllQt5Network.dll等Qt模块链接库,而Qt5Network.dll则需要SSL支持即依赖于libeay32.dllssleay32.dll

部署阶段,Qt5Core.dllQt5Network.dll显然必须位于test.dll的同级目录下;而将libeay32.dllssleay32.dll放在该目录则不起作用。

猜测原因:系统搜索libeay32.dllssleay32.dll的目录是系统路径或者调用者即Qt5Network.dll所在目录,而当前所在的只是test.dll的目录。虽然Qt5Network.dll也在当前目录,但它却是作为test.dll的依赖库被查找到的,系统并不直接识别当前目录下的Qt5Network.dll

直接的解决方法为将libeay32.dllssleay32.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(管理员)”即可。