【问题标题】:DELPHI: Store a some data in a shared memory to have an access from several appsDELPHI:将一些数据存储在共享内存中,以便从多个应用程序访问
【发布时间】:2014-04-28 17:06:11
【问题描述】:

问题定义
我有两个应用程序:FirstSecond第一个是我的,第二个是外包开发的。

1) 在某个时间,我需要从 First 应用程序向 Second 发送一条消息,以使 Second 可见并且最小化后最大化。

2) 为了执行 (1) 步骤,第二个 应用程序应将其句柄存储在共享内存中的某个位置,可以通过名称或任何可能的名称(如互斥锁)访问做)。

问题

那么,在操作内存中存储数据(句柄)的更好选择是什么?

【问题讨论】:

  • 互斥体是互斥内核对象。它们不用于存储句柄。
  • 为什么不呢?什么是决定?
  • 为什么不呢?好吧,他们不存储任何东西。他们是为了相互排斥。我必须说我根本不明白你在问什么。它非常广泛且不精确。
  • 好吧,我也不明白,因为我被要求找出是否有可能将第二个应用程序的句柄存储在共享内存中,并从第一个应用程序中读取这一点(像应用程序可以通过其名称访问互斥锁,并且在没有更多应用程序指向它之后将被销毁)。第二个问题 - 我是否仍然可以从第一个应用程序向第二个应用程序发送消息以最大化并超越最后一个应用程序。就是这样。
  • 我们一次喜欢一个问题。我真的不想为这两个不同的问题写一个答案。每一个都不是太糟糕。并且可能都是重复的。我建议你一次问一个问题。

标签: windows delphi windows-8 windows-7 delphi-xe3


【解决方案1】:

如果您想将此信息存储在共享位置,那么您通常会使用共享内存。在 Windows 术语中,这是一个文件映射对象。通过调用CreateFileMapping 创建一个。这些是内核对象,因此可以在内核命名空间中命名。

使用文件映射并不是一件很有趣的事情,因此您可能希望找到一个更简单的解决方案。给你的应用程序的主窗体一个唯一的类名。例如,您可以将表单的类命名为TMyCompanyNameMyProductNameMainForm。然后调用 FindWindow 传递该类名以查找现有应用程序窗口。

【讨论】:

  • 如果我不能强制其他开发人员使用这样的名称调用这个窗口类,但我可以让他存储它的句柄,该怎么办。那么在这种情况下 CreateFileMapping 是最好的解决方案吗?
  • 如果可以的话,我可能仍然会尽量避免文件映射。您可以使用其他方法使您的窗口更容易识别。使用窗口类名和窗口文本。那将是您的主要表格的标题,我认为其中包括程序名称。但如果你不能让自己这样做,那么文件映射就可以完成这项工作。
  • 好吧,我再说一遍 - 类名和窗口文本 - 完全掌握在外包开发人员的“手中”,我无法对他们产生太大影响。但是文件映射是否像互斥锁一样起作用?我的意思是 - 如果程序停止,它们会自动销毁吗?
  • 你可能不需要影响他们。您只需要确定是否可以根据标题和名称可靠地识别主窗口。文件映射是内核对象。当内核对象的所有句柄都关闭时,内核对象就会被销毁。
  • 我明白了。谢谢。我想我可以识别主窗口。但我认为更好的解决方案是关于文件映射。我认为也可以存储一些跨应用数据。这就是答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多