我的操作系统是Win7 x64。我有两个名为ComHost.exe和ClientApp.exe的exe。
ComHost.exe是一个独立的exe,也是进程外COM的COM主机。
ClientApp.exe通过调用CoCreateInstance(...)来创建COM实例。创建COM实例时,ComHost.exe进程启动。
在windows环境变量中,有一个变量“AppStatus = status1”。
在ClientApp.exe的实现中,代码就是那样
int ret = putenv("AppStatus=status2"); // Change the environment variable.
// do something
CoCreateInstance(...); // Start ComHost.exe
在ComHost.exe的实现中,我使用代码
获得了可验证的值char * pStatus = getenv("AppStatus");
案例1 :如果通过双击启动ComHost.exe,则pStatus的值为“status1”。
案例2 :如果在ClientApp.exe中启动ComHost.exe,则pStatus的值为“status2”。它继承了父进程ClientApp.exe的环境变量。
我的问题是:
我希望ComHost.exe始终读取OS定义的变量值,而不是从父进程继承的值。这意味着,在情况2中,我想获得值“status1”。有可能吗?
答案 0 :(得分:2)
如果双击“ComHost.exe”进程,则可能是从Explorer.EXE执行此操作。这意味着你没有得到“OS定义的变量值”。你只需从Explorer.EXE继承它(不可否认,它在登录期间以特殊方式启动。)
在幕后,我们总是使用CreateProcess
或其变体。它的默认行为是创建一个新进程,复制调用进程的环境变量。由于您不负责创建新进程(在案例2中,COM是),因此您无法改变此行为。
因此,在这两种情况下,getenv
将为您提供继承的值,而在案例2中,您无法获得“您将从Explorer.EXE继承的值”。