getenv的一个坑

getenv的一个坑本文探讨了 C 调用 C DLL 时 由于 getenv 和 setenv 函数特性导致的环境变量更新不同步问题

大家好,欢迎来到IT知识分享网。

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

 

 

 

 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/158868.html

(0)
上一篇 2025-01-17 16:45
下一篇 2025-01-17 17:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信