如何使COM主机进程避免从父进程继承环境变量

时间:2011-12-30 07:39:29

标签: c++ winapi environment-variables

我的操作系统是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”。有可能吗?

1 个答案:

答案 0 :(得分:2)

如果双击“ComHost.exe”进程,则可能是从Explorer.EXE执行此操作。这意味着你没有得到“OS定义的变量值”。你只需从Explorer.EXE继承它(不可否认,它在登录期间以特殊方式启动。)

在幕后,我们总是使用CreateProcess或其变体。它的默认行为是创建一个新进程,复制调用进程的环境变量。由于您不负责创建新进程(在案例2中,COM是),因此您无法改变此行为。

因此,在这两种情况下,getenv将为您提供继承的值,而在案例2中,您无法获得“您将从Explorer.EXE继承的值”。