0

如何将共享内存分配给如下所示的静态缓冲区,但使用 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 变得很棘手,因为您需要取消引用指针,这也是可行的,但这不是我想要的。

4

1 回答 1

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()将调用进程内的内存访问映射到该对象。这样,两个应用程序都在使用彼此共享的内存。当一个应用程序将数据写入对象时,另一个应用程序将看到它。

于 2017-06-09T15:39:49.603 回答