getenv的一个坑

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等软件。

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值