使用环境变量在两个应用程序之间进行通信

时间:2013-05-27 18:25:17

标签: windows windows-services environment-variables c++builder

问题

如何通过环境变量(不是系统或用户)与其他程序(例如,Windows服务程序)进行通信?

我们有什么

嗯,我有一个数据记录器的方案:

-------------------------          --------------------------------
| the things to measure |          | the things that do something |
-------------------------          --------------------------------
     |                                  ^
     | sensors                          | switches
     V                                  |
-------------------------------------------------------------------
|                     dedicated hardware                          |
-------------------------------------------------------------------
     | ^
     | |  serial communication 
     V |
---------------                                       -------------
|   Windows   | ------------------------------------> |   user    |
|   service   | <------------------------------------ | interface |
---------------           udp communication           -------------
                                                            |^  keyboard
                                                            V| and screen
                                                         --------
                                                         | user |
                                                         --------

目前的发展:

  • Windows服务始终在Windows运行时运行
  • 用户可以打开和关闭用户界面(当然:p)
  • Windows服务从传感器获取数据
  • 用户界面每100ms自动向Windows服务请求数据,并通过udp通信通过一些实现的协议(我们称之为GetData()命令并对其进行响应)向用户显示该数据。
  • 用户可以发送一些其他命令来更改要通过已实现的协议获取的数据(我们称之为SetSensors()命令并对其进行响应)

用户界面和Windows服务都是在Borland C + Builder 6上开发的,并使用来自FastNet选项卡的NMUDP组件进行UDP通信。

我们想要做什么

由于某些缓冲区问题并且只为发送SetSensors()命令和响应而释放udp频道,我们正在考虑不使用GetData()

  • Windows服务将从传感器获取数据并将其置于环境变量
  • 用户界面将读取它们以向用户显示

做我们想的事后的方案

-------------------------          --------------------------------
| the things to measure |          | the things that do something |
-------------------------          --------------------------------
     |                                  ^
     | sensors                          | switches
     V                                  |
-------------------------------------------------------------------
|                     dedicated hardware                          |
-------------------------------------------------------------------
     | ^
     | |  serial communication 
     V |
---------------                                       -------------
|             | ------------------------------------> |           |
|             |         environment variables         |           |
|             |         (get data from sensors)       |           |
|   Windows   |                                       |   user    |
|   service   |                                       | interface |
|             |                                       |           |
|             | ------------------------------------> |           |
|             | <------------------------------------ |           |
---------------           udp communication           -------------
                        (send commands to service)          |^  keyboard
                                                            V| and screen
                                                         --------
                                                         | user |
                                                         --------

任何方法都可以吗?

我们不会使用系统和用户环境变量,因为它在Windows注册表上写入,即它将保存到硬盘驱动器并且它变得更慢......

1 个答案:

答案 0 :(得分:0)

正如@HansPassant所说,我不能直接这样做。虽然我通过内存映射文件看到了一些方法,但只通过其他端口添加一个udp通信通道非常容易。所以:

-------------------------          --------------------------------
| the things to measure |          | the things that do something |
-------------------------          --------------------------------
     |                                  ^
     | sensors                          | switches
     V                                  |
-------------------------------------------------------------------
|                     dedicated hardware                          |
-------------------------------------------------------------------
     | ^
     | |  serial communication 
     V |
---------------                                       -------------
|             | ------------------------------------> |           |
|             |           udp communication (port 3)  |           |
|             |         (get data from sensors)       |           |
|   Windows   |                                       |   user    |
|   service   |                                       | interface |
|             |                             (port 1)  |           |
|             | ------------------------------------> |           |
|             | <------------------------------------ |           |
---------------           udp communication (port 2)  -------------
                        (send commands to service)          |^  keyboard
                                                            V| and screen
                                                         --------
                                                         | user |
                                                         --------

如果有人提供更好的解决方案,我会在将来将其标记为解决方案。