我有两个应用程序:X和Y. X是主要的应用程序,它处理大量的XML文件.它有十多年的历史,已经使用了六种技术来存储,处理和处理这些XML文件.我是一个正在开发的调试工具,它可以以更加人性化的方式处理和显示XML文件形成.基本上,它只是一个样式表的集合,将检测XML格式,如果它识别格式,它会将XML转换为显示在TWebBrowser组件中的HTML.问题:当Y是活动的时候,我希望X发送任何XML用于显示目的.但只有当Y运行时!如果Y没有运行,X就不会做任何事情.任何时候需要完成Y的检测,需要快速.我考虑过使用TCP / IP通信,但由于缺少Y引起的延迟太长了.特别是因为很多XML被处理有时.命名管道和类似的基于网络的解决方案也是一样的问题.我需要快速确定Y是否正在运行和可用,如果是,请快速发送XML,然后继续X.我还认为使Y成为基于COM的应用程序,或者可能添加一个基于COM的DLL,并允许进程间通信. DLL解决方案将是有趣的,因为它会向X公开一个方法来上传XML文件,然后将事件发送给Y来处理XML.这似乎是最好的选择,虽然我还需要检查DLL是否被注册.如果没有,那么X甚至不能调用它!应用程序X也将被不会收到Y或附加DLL的客户使用,因此在大多数情况下,DLL不会被注册. (正如我所说,这是在调试期间帮助…)但也许还有其他选择? TCP / IP太慢,COM有点太复杂了. X和Y将在同一系统上运行.或者只是X将在系统上,Y完全丢失.
关于使用内存映射文件…实际上,我需要记住,大多数时候,Y将不会运行,因此MMF会浪费内存. XML数据在X内的大小可以达到4 MB,因此内存中这个大小的多个块有点过分.它可以用于在X和Y之间发送状态消息,但是内存有时候与应用程序X有一点问题.虽然MMF可以连接到一个物理文件,但我试图避免完全写入任何临时文件.它的一个很好的解决方案,但我害怕不够好.
我想,还有一些额外的解释是正确的.应用程序X是一个将要使用几个小时的应用程序,用户可以通过大量的操作来转换大量的XML数据.应用程序X是与几个Web应用程序(REST),Web服务(SOAP)和其他应用程序进行通信的桌面应用程序,其中大部分是通过XML.Application Y仅用于窥视X正在运行的进程.基本上,X工作20分钟,Y弹出.从那时起,X应该开始发送XML到Y,直到Y再次消失或者直到X被终止.在大多数情况下,Y只会运行,以捕获正在运行的任务的一小部分,甚至可能会多次启动.但是我可能正在考虑整个事情在错误的方向.也许X应该是一个服务器,Y注册它…这不是一个真正的问题,当Y找不到X.但是X没有找到Y不会导致延迟或其他问题…
解决方法
你可以更简单地做,因为你只是试图找出一个应用程序是否从另一个运行.只要它们在同一台机器上由同一用户运行,您可以让X只需使用
FindWindow
()来查看Y是否正在运行.只要确保你给Y一个有意义的名字(在下面的示例中,它是TXMLFormatterForm):
var XMLWindow: HWnd; begin XMLWindow := FindWindow('TXMLFormatterForm',nil); if XMLWindow > 0 then // Y is running end;
你也可以使用Y的窗口标题(title),只要你确定它是不同的:
XMLWindow := FindWindow(nil,'Workshop Alex's XML Formatter');