Delphi 全系统共享数据

Delphi 全系统共享数据,delphi,delphi-2010,Delphi,Delphi 2010,晚上好。 我正在寻找一种方法来共享我的应用程序系统范围内的数据,以便其他应用程序可以读取该数据,然后对其执行任何操作(例如,格式化以显示数据,将其用于日志记录等)。数据需要在方法本身中动态更新 首先想到的是WMI,但随后出现了应用程序在读取WMI时暂停的问题。此外,如果在Delphi中可以设置自己的名称空间或类,我也不知道如何设置自己的名称空间或类 使用文件是另一种想法,但这可能会占用大量磁盘空间,而且这是一种用于实时数据的非常糟糕的方法 使用驱动程序可能是最好的选择,但这对我喜欢的用户端来说有

晚上好。 我正在寻找一种方法来共享我的应用程序系统范围内的数据,以便其他应用程序可以读取该数据,然后对其执行任何操作(例如,格式化以显示数据,将其用于日志记录等)。数据需要在方法本身中动态更新

首先想到的是WMI,但随后出现了应用程序在读取WMI时暂停的问题。此外,如果在Delphi中可以设置自己的名称空间或类,我也不知道如何设置自己的名称空间或类

使用文件是另一种想法,但这可能会占用大量磁盘空间,而且这是一种用于实时数据的非常糟糕的方法

使用驱动程序可能是最好的选择,但这对我喜欢的用户端来说有点太过分了,我甚至不知道从哪里开始

WM_COPYDATA会很棒,但我不确定这是否足够动态,以及它是否会占用大量资源

使用TCP/IP将是通过网络的最佳选择,但在没有网络要求的单个系统上运行时显然没有什么用处

正如你所看到的,我正在努力想办法解决这个问题。我不想只研究一种方法,结果却发现它最终行不通。本质上,类似于服务或后台进程的功能是记录数据,然后允许其他应用程序读取该数据。我只是不确定方法。我宁愿不需要仰角/UAC来做这件事,但如果需要,我会满足的

我在Delphi2010中运行此练习


有什么想法吗?

Windows中有几种IPC(进程间通信)方法。您的问题相当笼统,我可以建议使用内存映射文件存储共享数据,并通过
PostMessage
广播消息,通知其他应用程序共享数据已更改。

如果您不介意运行另一个进程,可以使用NoSQL数据库之一

我敢肯定,他们中的很多人都没有Delphi驱动程序,但其中一些人有REST驱动程序,因此几乎可以从任何东西驱动。

是在应用程序之间共享数据的一种简单方法。Memcached是内存中的键值存储,用于存储任意数据(字符串、对象)的小块

可以在google代码中找到Memcached的Delphi 2010客户端:

相关问题:


您希望创建一些客户机-服务器体系结构,也称为IPC

使用
WM_COPYDATA
是一个非常好的主意。我发现它在本地机器上速度快、重量轻、效率高。而且它可以通过系统一次广播到所有应用程序(如果某些应用程序不能正确处理,请小心使用)

您还可以使用内存映射文件共享一些内存。这可能是处理大量数据的最快IPC选项,但同步有点复杂(如果您想一次共享多个缓冲区)

命名管道是本地管道的良好候选。由于现代Windows版本存在安全问题(并且正在使用TCP/IP进行网络通信,因此您最好直接使用TCP/IP),因此它们往往难以在网络上实现/配置

我个人的建议是,您应该使用抽象类实现数据共享,能够提供多种实现。您可以先使用
WM_COPYDATA
,然后切换到命名管道、TCP/IP或HTTP,以便在网络上传播应用程序

对于我们的开源客户端服务器ORM,包括
WM\u COPY\u DATA
、命名管道、HTTP或直接进程内访问。您可以查看为实现模式提供的源代码。以下是一些基准测试,为您提供来自实际实现的数据:

 Client server access: 
  - Http client keep alive: 3001 assertions passed
     first in 7.87ms, done in 153.37ms i.e. 6520/s, average 153us
  - Http client multi connect: 3001 assertions passed
     first in 151us, done in 305.98ms i.e. 3268/s, average 305us
  - Named pipe access: 3003 assertions passed
     first in 78.67ms, done in 187.15ms i.e. 5343/s, average 187us
  - Local window messages: 3002 assertions passed
     first in 148us, done in 112.90ms i.e. 8857/s, average 112us
  - Direct in process access: 3001 assertions passed
     first in 44us, done in 41.69ms i.e. 23981/s, average 41us
  Total failed: 0 / 15014  - Client server access PASSED

如您所见,最快的是直接访问,然后是
WM\u COPY\u DATA
,然后是命名管道,然后是HTTP(即TCP/IP)。消息是大约5kb的JSON数据,包含113行,从服务器检索,然后在客户端上解析100次(是的,我们的框架很快:)。对于巨大的数据块(如4MB),
WM\u COPY\u data
比命名管道或HTTP-TCP/IP慢。

谷歌搜索“delphi进程间通信”会给你很多指针

我建议你看看,尤其是MadCodeHook(http://help.madshi.net/madCodeHook.htm)


我对该产品有很好的经验。

您可以使用一个数据库吗?我认为需要对“全系统”进行更多的澄清。您需要与其他会话交互(用户通过“切换用户”、远程桌面、Citrix等登录到同一系统),还是只需要当前登录?还是虚拟机子系统?我认为WM_CopyData不会跨越这样的界限,所以你应该澄清范围。嗨,克里斯。我不需要以任何方式与其他会话或虚拟机进行交互或传输。我正在看的是会话传输。谢谢阿诺。看起来本地Windows消息无疑是最简单、最有效的方法。我发送的数据只有3个值,每个值为3字节,然后可能是5个字符串,总计不到100字节,另外8个字符串,每个值介于1到50字节之间。发送的总容量将小于1KB,但某些值将非常频繁地更新(在某些情况下小于250ms)。@Scott'Chron'Pritchard你说得对,这正是GDI消息非常有效地处理的数据类型。整个Windows UI系统依赖于以尽可能快的速度处理数百万条此类消息。对于本地通信,这将是最好的解决方案。