• 记一次WinForm程序中主进程打开子进程并传递参数的操作过程(进程间传递参数)


    目标:想在WinForm程序之间传递参数。以便子进程作出相应的处理。

     

     一种错误的方法

     父进程的主程序:

    1             ProcessStartInfo psi = new ProcessStartInfo();
    2             psi.FileName = "ProcessChild.exe";
    3             psi.Arguments = txtArgs.Text;
    4             Process.Start(psi);//主要问题在这里

     子进程的主程序:

     1 txtArgs.Text = Process.GetCurrentProcess().StartInfo.Arguments; 

    结果如图:

    根本就传不过来的,错误的原因在于:想当然的认为父进程的ProcessStartInfo这个类的实例的成员Arguments传递到子进程中去了。其实Process.Start()返回一个Process类型的对象,数据在返回的对象中保存着,并没有跨进程传递。

     两种正确的方法

     第一种:

      从Main(string []args)接收传入的数据。这里要修改子进程的Main方法如下:

    1         static void Main(string []args)
    2         {
    3             Application.EnableVisualStyles();
    4             Application.SetCompatibleTextRenderingDefault(false);
    5             Application.Run(new frmChild());
    6         }

     因为默认是没有参数的。保存args里面的字符串,值得一提的是:args总是有至少一个元素,第二种方法方便看到。

    第二种:使用Environment类的方法。

    1             string[] args = Environment.GetCommandLineArgs();
    2            //txtArgs.Text = Process.GetCurrentProcess().StartInfo.Arguments;
    3             txtArgs.Text = args[0] + "
    ";

    当不从父进程启动时,结果如下:args的元素个数是1或者更多,第0个是固定的.

    当从父进程启动时,父进行传递的参数成为args的第二个元素:子进程中代码

    1             string[] args = Environment.GetCommandLineArgs();
    2            //txtArgs.Text = Process.GetCurrentProcess().StartInfo.Arguments;
    3             txtArgs.Text += args[0] + "
    ";
    4             if (args.Length > 1)
    5             {
    6                 txtArgs.Text += args[1];
    7             }

      还有一个地方需要注意:那就是当父程序传递参数时,如果传递来的字符串内有空格的话,那会被当成参数的分界,像下面这样:

     1           
     2 ///////////////////////////////////父程序///////////////////////
     3             ProcessStartInfo psi = new ProcessStartInfo();
     4             psi.FileName = @"C:Documents and SettingsAdministrator桌面ProcessArgsProcessChildinDebugProcessChild.exe";
     5             psi.Arguments = txtArgs.Text;
     6             Process.Start(psi);//主要问题在这里
     7 //
     8 ///////////////////////////////////子程序///////////////////////
     9  string[] args = Environment.GetCommandLineArgs();
    10            txtArgs.Text += "第0个参数" + args[0]+"
    ";
    11            int i = 1;
    12            MessageBox.Show(args.Length.ToString());
    13            if (args.Length > 1)//看子程序是怎么接收数据的
    14            {
    15                while (i < args.Length)
    16                {
    17                    txtArgs.Text += ""+i+"个参数:"+args[i]+"
     ";
    18                    i++;
    19                }
    20            }
    21            txtArgs.Text += "传递过来的参数个数是:"+args.Length.ToString();
    22 //结果:
    23 第0个参数C:Documents and SettingsAdministrator桌面ProcessArgsProcessChildinDebugProcessChild.exe
    24 第1个参数:这是从父进行传递来的参数
    25  第2个参数:空格1
    26  第3个参数:空格2
    27  传递过来的参数个数是:4

    在父程序传递数据如图:

    子程序接收到情况如下:

    子程序

    找到原因的地址:  http://stackoverflow.com/questions/10682212/how-to-pass-argument-to-a-process

  • 相关阅读:
    [转]VirtualBox错误 Unable to load R3 module 解决方案
    2014工作感想
    人生的真正价值
    react生成二维码
    判断对象中是否包含某个属性
    使用reduce进行数组对象去重
    filter筛选
    判断区分安卓ios
    scrollIntoView 与 scrollIntoViewIfNeeded API 介绍
    vue中使用@scroll实现分页处理(分页要做节流处理)
  • 原文地址:https://www.cnblogs.com/ddx-deng/p/3806132.html
Copyright © 2020-2023  润新知