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

一种错误的方法

父进程的主程序:

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

子进程的主程序:

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[] + "\r\n";

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

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

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

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

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

在父程序传递数据如图:

子程序接收到情况如下:

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

记一次WinForm程序中主进程打开子进程并传递参数的操作过程(进程间传递参数)的更多相关文章

  1. 在Winform程序中设置管理员权限及为用户组添加写入权限

    在我们一些Winform程序中,往往需要具有一些特殊的权限才能操作系统文件,我们可以设置运行程序具有管理员权限或者设置运行程序的目录具有写入的权限,如果是在操作系统里面,我们可以设置运行程序以管理员身 ...

  2. (转)在Winform程序中设置管理员权限及为用户组添加写入权限

    本文转载自:http://www.cnblogs.com/wuhuacong/p/5645172.html 在我们一些Winform程序中,往往需要具有一些特殊的权限才能操作系统文件,我们可以设置运行 ...

  3. Halcon的HWindowControl控件在WinForm程序中的使用介绍(重点解决图片缩放的问题)

     Halcon的HWindowControl控件在WinForm程序中的使用介绍(重点解决图片缩放的问题) 2016-12-04 20:11 362人阅读 评论(4) 收藏 举报  分类: Halco ...

  4. WinForm程序中两份mdf文件问题的解决

    在项目中用程序中嵌入mdf文件的方式来进行SQLServer数据库开发非常方便,用来发布开源项目等很方便,点击就可以运行,免部署,特别是在教学中用起来更加方便,老师不用先将数据库文件detach再发给 ...

  5. 在C#中winform程序中应用nlog日志工具

    在C#中winform程序中应用nlog日志工具,配置文件简单应用. 文件名 nlog.config,请注意修改属性为"始终复制",发布时候容易遇到不存在文件的错误提示. 通过Nu ...

  6. C#中Winform程序中如何实现多维表头【不通过第三方报表程序】

    问题:C#中Winform程序中如何实现多维表头. 在网上搜了很多方法,大多数方法对于我这种新手,看的都不是很懂.最后在新浪博客看到了一篇比较易懂的文章:[DataGridView二维表头与合并单元格 ...

  7. 在Winform程序中使用Spire.Pdf实现页面添加印章处理

    在一些场合,我们往往需要使用印章来给每页文档加盖一个印章,以表示该文档经过某个部门的认证的,常规的做法就是打印文档后盖章,如果需要电子档再行扫描一下.这样的的处理,如果文档很多,且仅仅需要电子文档的就 ...

  8. .NET混合开发解决方案7 WinForm程序中通过NuGet管理器引用集成WebView2控件

    系列目录     [已更新最新开发文章,点击查看详细] WebView2组件支持在WinForm.WPF.WinUI3.Win32应用程序中集成加载Web网页功能应用.本篇主要介绍如何在WinForm ...

  9. .NET混合开发解决方案8 WinForm程序中通过设置固定版本运行时的BrowserExecutableFolder属性集成WebView2控件

    系列目录     [已更新最新开发文章,点击查看详细] 在我的博客<.NET混合开发解决方案7 WinForm程序中通过NuGet管理器引用集成WebView2控件>中介绍了WinForm ...

随机推荐

  1. Python导出Excel为Lua/Json/Xml实例教程(三):终极需求

    相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 Python导出E ...

  2. Spark概述

    背景 目前按照大数据处理类型来分大致可以分为:批量数据处理.交互式数据查询.实时数据流处理,这三种数据处理方式对应的业务场景也都不一样: 关注大数据处理的应该都知道Hadoop,而Hadoop的核心为 ...

  3. Js IP转数字

    <script type="text/javascript"> function d2h(d) { return d.toString(16) } function h ...

  4. 萌新笔记——C++里创建 Trie字典树(中文词典)(三)(联想)

    萌新做词典第三篇,做得不好,还请指正,谢谢大佬! 今天把词典的联想做好了,也是比较low的,还改了之前的查询.遍历等代码.  Orz 一样地先放上运行结果: test1 ID : char : 件 w ...

  5. PHP严重致命错误处理:php Fatal error: Cannot redeclare class or function

    1.错误类型:PHP致命错误 Error type: PHP Fatal error Fatal error: Cannot redeclare (a) (previously declared in ...

  6. make 查找的文件名顺序为:“GNUmakefile”、“makefile”、“Makefile”

    默认的情况下,make会在工作目录(执行make的目录)下按照文件名顺序寻找makefile文件读取并执行,查找的文件名顺序为:“GNUmakefile”.“makefile”.“Makefile”. ...

  7. SqlServer SET IDENTITY_INSERT ON | OFF

    想要将值插入到自动编号(或者说是标识列,IDENTITY)中去,需要设定 SET IDENTITY_INSERT 示例: 1.首先建立一个有标识列的表: )) 2.尝试在表中做以下操作: , 'gar ...

  8. Python学习实践-----打印日历

    使用python语言实现在控制台打印日历 输入年.月.日 输出对应日历,指定的日数输出为'--' 程序没有做严格的输入验证,故输入整数即可. 以下为没有优化的源码: print_calendar.py ...

  9. PHP求职宝典系列——PHP Web 编程篇

    PHP Web 编程篇 form表单 1.简述 POST 和 GET 传输的最大容量分别是多少? GET 方法提交的表单数据被附加到 URL 上,并作为URL 的一部分发送到服务器端. URL 的长度 ...

  10. [python]设计模式

    需要说明:java跟python在思维模式上并不一样,java利用接口以及多态可以实现很多抽象上的东西,而python不行,其实以下很多设计模式写法并不适用也没有必要,更多是为了对比和帮助理解这些设计 ...