在独立的控制台和windows应用程序之间传递信息

本文关键字:之间 信息 应用程序 windows 独立 控制台 | 更新日期: 2023-09-27 18:12:50

我有两个独立的程序,一个是控制台应用程序,另一个是windows应用程序。

我的windows应用:

  • 具有图形界面、按钮和其他功能。
  • 其中一个名为"research"的按钮:当我点击它时,我用这行代码启动控制台应用程序:

    string strResult = ProcessHelper.LaunchProcessWaitForPipedResult("MyExecFile.exe", strArguments, 10 * 60 * 1000, true);   // 10 mins max
    

我的控制台应用:

  • 查询一个目录下的所有文件。

我的问题:

我想在windows应用程序上创建一个进度条来显示控制台应用程序的进度。问题是我不知道如何在两个进程之间传递这个信息。唯一的限制是不能使用数据库或文件。

在独立的控制台和windows应用程序之间传递信息

给定同一用户会话中的两个进程,并且希望避免会话之外的任何通信,我会考虑三个选项:

1。使用命名管道

父进程使用一个随机名称创建一个命名管道(并通过打开该名称来确认该名称未被使用)。它将该名称传递给子进程。使用一个简单的协议,允许子节点发送更新。

有许多挑战需要克服:

  • 获取逻辑以确保名称是唯一的(命名管道名称是全局的)。
  • 确保没有其他进程可以连接(默认的命名管道ACL限制连接到会话:这个可能就足够了)。
  • 处理不同父进程不支持进度更新的情况。
  • 处理子进程或父进程崩溃。
  • 避免在通信协议上过于聪明,但允许发展空间(当需要的不仅仅是一个简单的进度条时会发生什么?)

2。使用共享内存

在这种情况下,对象的名称默认情况下是会话的本地名称。默认情况下,这是更安全的。

父进程创建了足够大的共享内存(对于一个简单的进程更新:不多),一个互斥锁和一个事件。

然后,父进程与GUI并发地等待事件信号,当它进入互斥锁并读取共享内存的内容时。然后取消事件设置并离开互斥锁。

同时发送更新,子线程进入互斥锁,更新内存,并在离开互斥锁之前设置事件。

这里的挑战包括:

  • 定义共享内存布局。如果没有共享程序集,这很可能容易出错。
  • 避免其他人使用共享内存和同步对象。net使事情变得更加困难:在Win32中,我会使句柄可继承,因此不需要命名对象(除了调试)并直接传递给子进程。
  • 获得共享内存、互斥锁和事件的正确排序是至关重要的。内存损坏和更微妙的错误等待任何错误。
  • 使用共享内存做可变长度数据比较困难,对于简单的进度计数来说不是问题,但客户总是想要更多。

总结

我可能首先考虑命名管道(或者如果我想要更大的灵活性,可能会考虑自定义WMI类型)。BUT我只会在尝试了一切以避免首先需要多个进程之后才这样做。当我直接使用库时,为其他人提供一个共享库和控制台包装器将是一个更容易的选择。