2011-12-30 47 views
0

我的操作系統是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

回答

2

如果你雙擊「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

相關問題