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

时间:2018-07-10 10:24:42

标签: c# visual-studio vb6 console-application

我有一个VB6可执行文件,正在访问某些系统环境变量。我已经实现了一个.NET控制台应用程序,该应用程序检查这些环境变量是否存在,并根据需要创建它们,然后通过调用<div id="signupDiv" style="width:300px;max-width:100%;margin:auto"> 运行VB6应用程序。

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

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

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

设置环境vars .NET Cosnole应用程序的代码:

Process.Start

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

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);
    }
}

1 个答案:

答案 0 :(得分:2)

程序环境的副本将传递到它启动的程序。由于它是一个副本,因此第二个程序仅在获得第二个程序的状态(并进行更改)时才能看到其状态。没有其他程序可以更改其他程序的环境。

使用ShellExecute(告诉ProcessStart时)是在要求资源管理器为您启动程序。该程序将获得资源管理器环境的副本。

更改系统环境时,程序可以向所有打开的窗口发送消息,说明环境已更改(如setx一样-请参见setx /?)。但是只有Explorer.exe会注意此消息。因此,只有在资源管理器收到此消息后由资源管理器启动的程序才能看到更改。

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

在命令提示符下。输入

set MyCat=PewResearch
cmd /k echo %MyCat%

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

这是通知消息

  

WM_SETTINGCHANGE

     

系统将WM_SETTINGCHANGE消息发送给所有   SystemParametersInfo函数更改一个顶级窗口   系统范围的设置或策略设置已更改。

     

应用程序应将WM_SETTINGCHANGE发送到所有顶级窗口   当他们更改系统参数时。 (此消息不能是   直接发送到窗口。)将WM_SETTINGCHANGE消息发送给   所有顶层视窗,请将SendMessageTimeout函数与   hwnd参数设置为HWND_BROADCAST。