控制台应用程序启动另一个无法访问的流程环

我有一个VB6可执行文件,它访问一些系统环境变量。 我已经实现了一个.NET控制台应用程序,它检查这些环境变量是否存在,如果需要的话创建它们,然后通过调用Process.Start运行VB6应用程序。

这样做,VB6应用程序找不到环境变量,它说它们不存在。

如果我从Windows资源管理器运行VB6应用程序,它工作正常,可以找到变量。

所以似乎VB6应用程序在.NET控制台应用程序的上下文中运行,无法访问系统环境变量!

用于设置环境的代码vars .NET Cosnole app:

 foreach(var varObject in Variables) { var envVar = Envrionment.GetEnvironmentVariable(varObject.Name , EnvironmentVariableTarget.Machine); if(string.IsNullOrEmpty(envVar) { Environment.SetEnvironmentVariable(varObject.Name,varObject.Value, EnvironmentVariableTarget.Machine); } } 

从.NET Cosnole应用程序运行VB6应用程序的代码:

 var processInfo = new ProcessStartInfo(VB6ApplicationFilePath); processInfo.UseShellExecute = true processInfo.WindwoStyle= ProcessWindowStyle.Hidden; Process.Start(processInfo); 

程序环境的副本将传递给它启动的程序。 因为它是一个副本,所以第二个程序只能看到它所处的状态(并进行了更改)。 没有其他程序可以改变另一个程序的环境。

使用ShellExecute (您告诉ProcessStart )时,您要求Explorer为您启动该程序。 该程序将获得Explorer环境的副本。

在更改系统环境时,程序可以向所有打开的窗口发送消息,说明环境已经改变(如setx所做 – 请参阅setx /? )。 但只有Explorer.exe会关注此消息。 因此,只有资源管理器在资源管理器启动后才会收到此消息的程序将看到更改。

这些是.NET调用的API调用。 在Windows中,所有程序都由CreateProcessEx (或旧程序CreateProcess )启动。 ShellexecuteShellexecuteEx处理命令,就像在Explorer的“开始 – 运行”对话框(Winkey + R)中键入它一样,然后更改它并调用CreateProcessEx

在命令提示符下。 类型

 set MyCat=PewResearch cmd /k echo %MyCat% 

我们设置了一个环境变量,启动一个打印该变量的新命令提示符。

这是通知的消息

WM_SETTINGCHANGE

当SystemParametersInfo函数更改系统范围设置或策略设置已更改时,系统会将WM_SETTINGCHANGE消息发送到所有顶级窗口。

应用程序应在更改系统参数时将WM_SETTINGCHANGE发送到所有顶级窗口。 (此消息不能直接发送到窗口。)要将WM_SETTINGCHANGE消息发送到所有顶级窗口,请使用SendMessageTimeout函数,并将hwnd参数设置为HWND_BROADCAST。