getenv和setenv这一对,是stdlib中提供的获取和设置当前进程环境变量的函数,我本人也常常使用。
今天写一个小程序,从C#要调用C++的DLL,而C++的代码依赖某一环境变量“MAK_VRLDIR”,相关代码如下:
...
const char* vrlDir=getenv("MAK_VRLDIR");
...
刚开始,我并没有当回事,直接在C#代码中写了如下代码:
System.Environment.SetEnvironmentVariable("MAK_VRLDIR", "C:\\VRL", System.EnvironmentVariableTarget.Process);
随即调试,发现C++的DLL总是不能正常工作。
先说结论,再说调试过程:
getenv函数读取的环境变量的值,保存在一个全局数组里,该数组在DLL加载时,自动从进程环境变量读取初始化,随后的getenv,都是从该全局数组内读取(后面会验证)。
setenv函数,既修改这个全局数组,也修改进程的环境变量。
Windows提供的Get\SetEnvironmentVariable和c#的Get\SetEnvironmentVariable都是直接操作进程环境变量。
存在的问题是:
如系统中有环境变量MAK_VRLDIR=C:\VRL,默认情况下调用getenv和GetEnvironmentVariable都没有问题。
但是如果我调用SetEnvironmentVariable(MAK_VRLDIR=C:\TEST),这时候进程的环境变量已经更改,但是getenv("MAK_VRLDIR")得到的结果还是旧的C:\VRL。
调试过程后面有时间补上,查看进程的环境变量,可以使用Procexp等软件。