记一次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] + "\r\n";

 

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

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

1             string[] args = Environment.GetCommandLineArgs();
2            //txtArgs.Text = Process.GetCurrentProcess().StartInfo.Arguments;
3             txtArgs.Text += args[0] + "\r\n";
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 Settings\Administrator\桌面\ProcessArgs\ProcessChild\bin\Debug\ProcessChild.exe";
 5             psi.Arguments = txtArgs.Text;
 6             Process.Start(psi);//主要问题在这里
 7 //
 8 ///////////////////////////////////子程序///////////////////////
 9  string[] args = Environment.GetCommandLineArgs();
10            txtArgs.Text += "第0个参数" + args[0]+"\r\n";
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]+"\r\n ";
18                    i++;
19                }
20            }
21            txtArgs.Text += "传递过来的参数个数是:"+args.Length.ToString();
22 //结果:
23 第0个参数C:\Documents and Settings\Administrator\桌面\ProcessArgs\ProcessChild\bin\Debug\ProcessChild.exe
24 第1个参数:这是从父进行传递来的参数
25  第2个参数:空格1
26  第3个参数:空格2
27  传递过来的参数个数是:4

 

在父程序传递数据如图:

子程序接收到情况如下:

子程序

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

posted @ 2014-06-24 15:09  deeeeeed  阅读(937)  评论(0编辑  收藏  举报

pppppppppppppp