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

时间:2013-06-13 22:48:00

标签: delphi delphi-xe2 ipc

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

1 个答案:

答案 0 :(得分:5)

您可以使用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);