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

iMa*_*ari 4 delphi service ipc

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

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

Jer*_*ers 9

您想要使用Delphi进行IPC(进程间通信).

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

你的问题就在这里.

如果您想使用纯Windows API,请查看OutputDebugString通信的实现方式.
有几种工具可以监听该机制,许多应用程序可以向其发送信息.

搜索DBWIN_DATA_READYDbWin32以获取有关OutputDebugString协议如何工作的更多信息.

是很好的阅读.


Arn*_*hez 5

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

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

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

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

如果你想开发服务,你可以使用DataSnap,比如RemObjects,或者你可以尝试我们的开源mORmot框架,它能够通过REST 创建基于接口的服务,使用简单的JSON消息,在进程中,使用GDI消息,命名管道或TCP/HTTP - 免费,具有无与伦比的性能,内置安全性,从Delphi 6到XE2.对于基于事件的任务,仅使用mORMot中可用的客户端 - 服务器ORM 就足够了:创建存储事件的表/类(甚至可以定义循环内存存储 - 不需要使用SQLite3引擎也不需要这里有一个DB),然后询问自上次刷新以来的所有待处理事件.并且服务器可以安全地成为后台服务或普通应用程序 - 一些mORMot用户甚至可以将相同的可执行文件作为独立应用程序,服务器服务,应用程序服务器或UI客户端,只需更改组态.

编辑/公告:

mORMot路线图上,我们添加了一个新的即将推出的功能,以便从服务器轻松实现单向回调.

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

它将通过发布/订阅模式用于简单的事件协作,并允许事件源.我将尝试使其实现两种模式:轮询和锁定等待.直接回答你的问题.