getenv的一个坑

本文探讨了C#调用C++DLL时,由于getenv和setenv函数特性导致的环境变量更新不同步问题。getenv读取的是加载时初始化的全局数组,而setenv同时修改全局数组和进程环境变量。C#和Windows API直接操作进程环境变量,可能造成C++代码中环境变量值未更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值