Delphi XE2:在两个不同的进程之间共享一个变量?

Posted

技术标签:

【中文标题】Delphi XE2:在两个不同的进程之间共享一个变量?【英文标题】:Delphi XE2: Sharing a variable between two different processes? 【发布时间】:2013-06-13 22:48:00 【问题描述】:

我需要在 2 个正在运行的程序(例如 MyProgramA.exe 和 MyProgramB.exe)之间共享一个布尔变量的值;这些是不同的程序,而不是同一程序的实例。我更喜欢内存中的全局变量而不是带有 Windows 消息的 IPC,因为我认为在内存中设置一个可由不同程序访问的全局变量比带有 Windows 消息的 IPC 更快(即瞬时)、更安全和更可靠。

【问题讨论】:

你有没有尝试过?有很多不同的方法可以做到这一点,并且有大量的资源可以告诉你如何做。问题是,这被认为是一个“购物清单”问题,可能会因为有太多不同的可能答案而被关闭。 我不知道有什么方法可以在不同进程之间共享一个全局变量。我做了一个谷歌搜索,但没有给我这个问题的正确答案。因此,如果有很多不同的方法可以做到这一点,请仅列举一些最好的方法,以便我继续研究。 在 Google 搜索中,这是我在 *** 上的第一个结果:***.com/questions/5646202/… 所有标准的 IPC 方法都可以做到这一点,但它们都不是真正的“共享变量”或“瞬时”。由于您熟悉 IPC 这个短语,因此请对各种这样做的方法进行一些研究,将您正在考虑的选项缩小到其中的几个,然后问一个与那些选择的选项。 (我也质疑您的“更安全、更可靠”的结论。如果两个不同的进程可以访问它,那么其他进程也可以通过各种机制访问它。)IMO,这个问题的范围非常广泛,目前的形式相当模糊。 正如我之前所说,进程之间没有真正的“全局共享变量”,进程之间的任何事情都不像进程中的真正变量那样“瞬时”。 IPC 涉及跨越进程边界,无论您选择何种机制,都会产生一些开销。在 same 进程中的线程之间安全地共享变量有一些开销;在不同的进程之间这样做有更多。 【参考方案1】:

您可以使用 Win32 API CreateFileMapping() 函数分配一块共享内存,然后使用 MapViewOfFile() 函数访问该内存。两个进程都需要以相同的名称调用CreateFileMapping() 以共享相同的映射,但它们都会收到各自的映射本地视图。

例如:

uses
  ..., Windows;

var
  Mapping: THandle = 0;
  MyBoolean: PBoolean = nil;

...

Mapping := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(Boolean), 'MyMappedBoolean');
if Mapping <> 0 then
  MyBoolean := PBoolean(MapViewOfFile(Mapping, FILE_MAP_WRITE, 0, 0, SizeOf(Boolean));

...

if MyBoolean <> nil then
  MyBoolean^ := ...;

...

if MyBoolean <> nil then
begin
  if MyBoolean^ then
    ...
  else
    ...
end;

...

if MyBoolean <> nil then
  UnmapViewOfFile(MyBoolean);
if Mapping <> 0 then
  CloseHandle(Mapping);

【讨论】:

我可以在FormCreate中调用CreateFileMapping,然后在程序的整个运行时间内保留共享内存块吗?程序关闭时是否需要释放共享内存? 是的,您可以在整个过程的生命周期中使用它。不,您不需要释放它,因为操作系统会在进程终止时自动关闭打开的句柄,并且文件映射会在其所有句柄都关闭时自动释放。但是,出于良好的编程习惯,您应该释放您分配的任何内容,因此您应该在使用完映射后显式取消映射并关闭它。 感谢您的提示!您将如何取消映射和关闭映射? UnmapViewOfFile()CloseHandle(),分别。

以上是关于Delphi XE2:在两个不同的进程之间共享一个变量?的主要内容,如果未能解决你的问题,请参考以下文章

Delphi XE2 应用程序在 IPAD 上没有响应

在两个进程之间共享内存(C、Windows)

2个进程(应用程序)之间的共享内存

Delphi - 需要 XE2 代码到 Delphi7。使用wininet下载文件

跨两个不同进程的 QSharedMemory

有没有 Delphi XE2 样式库?