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

问题描述:

我的操作系统是Win7 x64。我有两个名为ComHost.exe和ClientApp.exe的exe文件。如何使COM主机进程避免继承父进程的环境变量

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获得viriable值:如果通过双击启动ComHost.exe,pStatus的值为“status1”。

案例2:如果启动ClientApp.exe中的ComHost.exe,则pStatus的值为“status2”。它继承父级进程ClientApp.exe的环境变量。

我的问题是:

我想ComHost.exe总是读由OS不是从进程继承值定义的变量值。这意味着,在情况2中,我想要得到值“status1”。可能吗?

+0

可能的,当然。我认为你在这里使用环境变量传递状态的方法错误 - 首先,你用你的状态来污染所有的应用程序,其次,一旦主机进程运行,你就不能更新状态。 – 2011-12-30 08:50:19

+0

我拿变量AppStatus作为例子就是让事情变得容易理解。 – Jeffrey 2011-12-30 09:06:11

+0

我的观点依然存在 - 很可能使用环境变量不是解决方案。很多时候,这里发布的问题已经被划分为一个简单和困难(或不可能)的部分,后者被问到,同时查看整个问题会告诉我们解决方案的第一部分其实是错误的。 – 2011-12-30 09:36:19

如果你双击“ComHost.exe”进程,你可能从Explorer.EXE这样做。这意味着你没有得到“由OS定义的变量值”。您只需从Explorer.EXE继承它(可以确定,在登录过程中以特殊方式启动)。

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

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

+0

从Explorer.EXE继承的值保存在注册表中。我想我可以尝试解决方法,通过注册表中的值设置变量,然后调用CoCreateInstance(...);启动ComHost.exe。 – Jeffrey 2011-12-30 14:11:37