如何从另一个Delphi应用程序中激活Delphi应用程序中的事件?

时间:2012-09-05 10:08:55

标签: delphi service ipc

请在标记为重复之前阅读。

我正在创建一组依赖智能卡进行身份验证的应用程序。到目前为止,每个应用程序都单独控制了智能卡读卡器。几周后,我的一些客户将同时使用多个应用程序。所以,我想也许创建一个控制身份验证过程的服务应用程序会更实际。我希望我的桌面应用程序告诉他们对身份验证过程感兴趣的服务应用程序,然后服务应用程序会向他们提供有关当前用户的信息。使用named pipes,这部分很简单。困难的部分是,服务如何告诉桌面应用程序发生了事件(UserLogInUserLogOutPermissionsChanged,......等等。到目前为止,我有两种方法。 CallBack个函数和Messages。有没有人有更好的主意?我确定有人。

3 个答案:

答案 0 :(得分:9)

您希望与Delphi进行IPC(进程间通信)。

有许多链接可以帮助您,Cromis IPC只是一个让您了解自己所追求的内容。

与你的问题类似的问题是here

如果您想使用纯Windows API,请查看how OutputDebugString communications is implemented 有几种工具可以监听该机制,许多应用程序可以向其发送信息。

搜索DBWIN_DATA_READYDbWin32,详细了解OutputDebugString的协议如何运作。

Thisthis读起来不错。

答案 1 :(得分:5)

当它进入IPC时,一些提示:

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

我建议不要在桌面应用程序上的无状态架构上使用回调,而是轮询。你打开一个与服务器的通信通道,然后每隔一秒/半秒(在你的用户界面中使用TTimer),你提出一个小请求,询问改变了什么(你可以提供修订号或时间戳你最后的检索)。因此,您将桌面数据与待处理事件同步。要求对现有连接进行更新非常快,并且如果没有任何更改,将仅通过网络来回发送一个IP数据包。这是一个非常小的任务,不会减慢客户端和服务器(如果使用一些内存缓存)。

在实践中,从实际应用程序来看,从最终用户的角度来看,这样的无状态架构非常灵敏,并且更易于部署。您不需要在每个桌面应用程序上创建服务器,因此您不必打开防火墙端口等。由于HTTP是无状态的,因此它甚至可以上网。

如果您想开发服务,可以使用 DataSnap ,例如RemObjects,或者您可以尝试我们的Open Source mORmot framework,它可以创建interface-based services通过REST,使用GDI消息,命名管道或TCP / HTTP在过程中轻松发送JSON消息 - 免费,具有无与伦比的性能,内置安全性,以及从Delphi 6到XE2。对于基于事件的任务,只需使用 mORMot 中提供的客户端 - 服务器ORM就足够了:创建一个存储事件的表/类(您甚至可以定义循环内存存储 - 这里不需要使用SQLite3引擎或数据库),然后询问自上次刷新以来的所有待处理事件。并且服务器可以安全地成为后台服务或普通应用程序 - 某些 mORMot 用户甚至可以将相同的可执行文件作为独立应用程序,服务器服务,应用程序服务器或UI客户端,只需更改配置即可。

编辑/公告:

mORMot roadmap上,我们添加了即将推出的新功能,以便从服务器轻松实现单向回调。

即,将透明的“推送”模式添加到我们的面向服务的体系结构框架中。 目标是实现从服务器端触发的通知事件,非常容易从Delphi代码,通过一些interface定义,甚至通过单个HTTP连接 - 例如,WCF不允许这样做:它将需要双重绑定,所以需要打开防火墙端口等。

它将通过Event Collaboration轻松publish / subscribe pattern,并允许Event Sourcing。我将尝试使其实现两种模式:轮询和锁定等待。直接回答你的问题。

答案 2 :(得分:0)

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

一个例子是Indy TIdTelnetClient类,它使用一个线程来处理来自服务器的传入消息。

您可以构建类似的基于文本的协议,只需要服务中的Indy TCP服务器实例,以及应用程序中的一个Indy Client实例。