如何在火灾从其他应用程序德尔福Delphi应用程序的事件?(How to fire events i

2019-07-31 09:00发布

作为标记重复前请仔细阅读。

我创建了一套依靠智能卡进行身份验证的应用程序。 截至目前,每个应用程序都有独立控制的智能卡读卡器。 在几个星期后,我的一些客户将使用在同一时间多个应用程序。 所以,我想,也许这将是更实际的创建,它控制了认证过程的服务应用程序。 我想我的桌面应用程序,告诉服务应用程序,他们有兴趣在认证过程中,和服务应用程序,然后将它们提供有关当前用户的信息。 这部分很简单,使用named pipes 。 难的是,如何能服务告知已发生的事件的桌面应用程序( UserLogInUserLogOutPermissionsChanged ,...仅举几例)。 到目前为止,我心里有两种方法。 CallBack函数和Messages 。 有没有人有一个更好的主意吗? 我敢肯定有人。

Answer 1:

你想要做的IPC(进程间通信)与德尔福。

有许多链接,可以帮助你, Cromis IPC只是一个给你的想法,你所追求的。

以你这样的相似,所以问题是在这里 。

如果你想要去的纯粹的Windows API,然后看看如何OutputDebugString的通信实现 。
有几个工具可以听机制和许多应用程序可以把它发送信息。

搜索DBWIN_DATA_READY和DbWin32有关本协议如何更多信息OutputDebugString的工作。

这和这是良好的阅读。



Answer 2:

当它进入IPC,一些提示:

  • 不要在一个协议捆绑:例如,如果你实现了一个名为管道通信,你以后会或许需要在网络上运行,甚至通过HTTP;
  • 不要重新发明轮子,也不使用专有消息,但标准格式(如XML / JSON / BSON);
  • 回调的事件是有点难以实现,因为常见的模式可以实现服务器为每个桌面客户端,从服务器接收通知。

我的建议是不要使用回调 ,但投票 无状态的架构,在桌面上的应用程序。 您打开与服务器的通信信道,那么每一秒/半秒(使用TTimer在UI),你犯了一个小小的请求,要求什么了变化(你可以把版本号或最后一次检索的时间戳) 。 因此,你有未完成的事件同步您的桌面数据。 要求现有连接上的更新速度非常快,而且只会通过网络发送一个IP数据包来回,如果什么都没有改变。 这是一个非常小的任务,而不会减慢,也不是客户端还是服务器(如果你使用一些内存高速缓存)。

在实践中,具有实际应用中,这样的无状态的架构是非常敏感的,从最终用户的角度,并且更加容易部署。 你并不需要创建每个桌面应用程序的服务器,所以您不必打开防火墙端口或此类。 由于HTTP是无状态的,它甚至互联网友好。

如果你想开发服务,你可以使用的DataSnap,类似的RemObjects或者你可以尝试我们的开源mORmot框架,它能够创建基于接口的服务超过REST灯的JSON消息是,无论是在过程中,采用GDI的消息,命名管道或TCP / HTTP - 免费,具有无与伦比的性能,内置的安全性,并从Delphi 6的可达XE2。 为了您的基于事件的任务,只是用在mORMot提供的客户端-服务器ORM可能是不够的:创建一个表/类存储的事件(你甚至可以定义一个循环内存存储-无需使用sqlite3的引擎,也没有这里DB),然后要求自上次刷新所有挂起的事件。 而服务器可以安全地后台服务,或者一个普通的应用程序-一些mORMot用户甚至能够成为任何一个独立的应用程序,服务器服务,应用服务器,或用户界面的客户端相同的可执行文件,只需通过改变组态。

编辑/公告:

在mORMot路线图 ,我们增加了一个新的即将推出的功能,轻松地实现从服务器单向回调。

也就是说,加上透明的“推”模式给我们的面向服务的架构框架。 目的是要实现从服务器端,从Delphi代码很容易触发通知事件,通过一些interface的定义,即使在一个单一的HTTP连接-例如,WCF不允许这样的:它需要一个双重结合,因此需要打开防火墙端口,这样。

它将用于容易事件协作 ,通过发布/订阅模式 ,并允许事件采购 。 我会尽量做到实现两种模式:轮询和锁和等待。 直接回答你的问题。



Answer 3:

您可以使用一个简单的TCP套接字连接(双向),以允许异步服务器到客户端的消息在同一插座上。

一个例子是印TIdTelnetClient类,它使用一个线程用于从所述服务器收到的消息。

你可以建立一个类似的基于文本的协议,只需要在服务中印TCP服务器实例,以及一个印Client实例的应用程序(一个或多个)。



文章来源: How to fire events in a Delphi application from another Delphi application?