如何使用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变得棘手,因为你需要取消引用指针,这也是可行的,但它不是我想要的。
答案 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()
将调用进程内的内存访问映射到该对象。通过这种方式,两个应用程序都使用共享内存。当一个应用程序将数据写入对象时,另一个应用程序将会看到它。