【问题标题】:Console application starting another process environment variables not accessible控制台应用程序启动另一个进程环境变量不可访问
【发布时间】:2018-07-10 10:24:41
【问题描述】:

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

执行此操作后,VB6 应用程序找不到环境变量,并说它们不存在。

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

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

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

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

【问题讨论】:

  • 我重新标记,假设您的意思是 vb.net 而不是 vba.net
  • 您能分享一下您的代码有问题的部分吗? (首先,见:minimal reproducible example
  • 你如何设置环境变量?
  • 您发布更新时似乎缺少环境变量的实际设置,您可以添加缺少的位吗?
  • 刚刚更新。谢谢。

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


【解决方案1】:

程序环境的副本被传递给它启动的程序。因为它是一个副本,所以第二个程序只能看到它在给定它时所处的状态(以及它所做的更改)。没有其他程序可以改变其他程序的环境。

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

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

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

在命令提示符下。类型

set MyCat=PewResearch
cmd /k echo %MyCat%

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

这是通知的消息

WM_SETTINGCHANGE

系统向所有用户发送 WM_SETTINGCHANGE 消息 SystemParametersInfo 函数更改 a 时的顶级窗口 系统范围的设置或策略设置发生更改时。

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

【讨论】:

  • 当我设置 UseShellExecute = true 时。尽管如此,VB6 应用程序仍无法归档环境变量。如何以某种方式运行 VB6 应用程序,它未绑定到 .NET 进程?什么是正确的方法?非常感谢
  • 不要使用UseShellExecute。我的回答是关于为什么不这样做。
  • 另见ProcessStartInfo.EnvironmentVariables
  • 不管我用不用,VB6应用程序执行时找不到机器环境变量!
  • 您是否对它们进行了更改,从而导致有关更改的广播消息。另外,程序员不应该更改系统级别的设置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多