2011-12-30 17 views
0

私のOSはWin7 x64です。 ComHost.exeとClientApp.exeの2つのexeがあります。COMホストプロセスが親プロセスから環境変数を継承しないようにする方法

ComHost.exeはスタンドアロンのexeファイルであり、out-of-process COMのCOMホストです。

ClientApp.exeは、CoCreateInstance(...)を呼び出してCOMインスタンスを作成します。 COMインスタンスを作成すると、プロセスComHost.exeが起動します。

Windows環境変数には、変数 "AppStatus = status1"があります。 ClientApp.exe、コードの実装では

がComHost.exeの実装ではその

int ret = putenv("AppStatus=status2"); // Change the environment variable. 
// do something 
CoCreateInstance(...); // Start 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

可能です。ステータスを伝える環境変数を使用して、間違った方向にいると思います。まず、すべてのアプリケーションをステータスで汚染しています。そして、ホストプロセスが実行されたらステータスを更新することはできません。 –

+0

変数としてAppStatusを取るのは、そのことを理解しやすくするための例です。 – Jeffrey

+0

私の指摘は依然として立っています。環境変数を使用する可能性が最も高いのは解決策ではありません。非常に頻繁に、ここに掲示された質問は簡単で難しい(または不可能な)部分に分割されています。後者は尋ねられますが、問題の全体を見ると、ソリューションの最初の部分が実際に間違った方法であることがわかります。 –

答えて

2

"ComHost.exe"プロセスをダブルクリックすると、おそらくExplorer.EXEから実行されます。これは、OSによって定義された「可変値」を取得しないことを意味します。 Explorer.EXEから継承するだけです(ログイン時に特殊な方法で起動されます)。

私たちはいつもCreateProcessまたはその変形を使用しています。デフォルトでは、呼び出し元プロセスの環境変数をコピーして新しいプロセスを作成します。新しいプロセスの作成を担当していないので(ケース2、COMの場合)、この動作を変更することはできません。

したがって、getenvは継承された値を取得し、ケース2では「Explorer.EXEから継承した」という値を取得できません。

+0

Explorer.EXEから継承した値は、レジストリに保存されます。レジストリから値を変数に設定し、CoCreateInstance(...)を呼び出すという回避策を試すことができます。 ComHost.exeを起動します。 – Jeffrey

関連する問題