大家好,欢迎来到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