程序中动态设置环境变量(局部):SetEnvironmentVariableA和_putenv的区别

        在项目中用到了Eccode第三方库读取grb数据,使用该库要定义一个环境变量“ECCODES_DEFINITION_PATH,可以直接在电脑上设置环境变量,但是从用户角度考虑要尽量安装简介,所以要求在程序中动态设定该环境变量。本人菜鸟一枚,没有什么经验按照大哥哥提供的方式作参考,进行了动态设置,结果发现了一些问题。

        开始使用:

SetEnvironmentVariableA(“ECCODES_DEFINITION_PATH”,“d:\\eccodes\\definitions”);

        运行后并没有设置成果,任然无法打开grb数据。经查阅相关资料,该函数只能设置当前进程的环境变量,无法设置系统环境变量,但在设置前该进程已经启动,即使在运行过程中设置成果(通过GetEnvironmentVariableA()函数可以获取到该环境变量),但仍然无法起作用,需要重新启动该进程,而进程结束后该环境变量就失效了。顿时觉得这个函数根本没用,又经过查阅后发现,该函数设置的环境变量可以继承给该进程的子进程,于是设置环境变量后又开了一个进程(项目中的release版本),结果显示主进程(debug版)的仍无法打开,而子进程中的release版可以打开了。

        虽然搞明白了这个,但是无法解决项目中的需求(一个进程,动态设置,并起作用),又尝试其他方法进行设置,发现使用:

_putenv("ECCODES_DEFINITION_PATH=d:\\eccodes\\definitions")

        用该函数设置的环境变量可以直接作用于当前进程,好奇为何如此,查阅相关资料后发现,该函数是通过一个全局的变量_environ来进行操作的,即首次使用putenv或getenv时,用该变量接收系统的环境变量,如果putenv,直接设置到该变量中,而后面用的时候也是从该变量中获取,不直接涉及系统的环境变量,自然可以在当前起作用。(注意:只影响当前进程的局部环境,不能用于修改命令级别的环境),在项目中用该函数设置后可在当前进程中打开grb数据。

参考资料:

https://docs.microsoft.com/zh-cn/cpp/c-runtime-library/reference/putenv-s-wputenv-s?view=vs-2019

https://docs.microsoft.com/zh-cn/cpp/c-runtime-library/environ-wenviron?view=vs-2019

https://blog.csdn.net/ghevinn/article/details/8021880

        本人菜鸟一枚,如有不对,请路过的高手多多指教!谢谢!

你可能感兴趣的:(c++项目)