使用MapViewOfFile分配静态共享内存

时间:2017-06-09 13:00:26

标签: c++ winapi shared-memory memory-mapped-files data-segment

如何使用CreateFileMapping和MapViewOfFile将共享内存分配给静态缓冲区,如下所示。

#pragma data_seg(".ABC")
__declspec (dllexport) char buffer[10000]  = {0};
#pragma data_seg()
#pragma comment(linker, "-section:.ABC,rws")

目标是创建一个在C ++和FORTRAN应用程序之间共享的静态共享缓冲区,就像使用data_seg时一样。在创建动态分配缓冲区时,FORTRAN变得棘手,因为你需要取消引用指针,这也是可行的,但它不是我想要的。

1 个答案:

答案 0 :(得分:1)

等效的Win32 API调用如下所示:

SECURITY_DESCRIPTOR sd;
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE);

SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = &sd;
sa.bInheritHandle = FALSE;

HANDLE hMapping = CreateFileMapping(INVALID_HANDLE_VALUE, &sa, PAGE_READWRITE, 0, 10000, TEXT("ABC")); 
if (!hMapping) ... // error handling

char *buffer = (char*) MapViewOfFile(hMapping, FILE_MAP_WRITE, 0, 0, 10000);
if (!buffer) ... // error handling

// use buffer as needed... 

UnmapViewOfFile(buffer);
CloseHandle(hMapping);

两个应用都必须使用相同的CreateFileMapping()值调用lpName才能访问系统内核中的相同映射对象。无论哪个应用程序首先调用CreateFileMapping()都会创建对象,第二个应用程序将获得现有对象的句柄。然后,MapViewOfFile()将调用进程内的内存访问映射到该对象。通过这种方式,两个应用程序都使用共享内存。当一个应用程序将数据写入对象时,另一个应用程序将会看到它。