C++ 使用MapViewOfFile分配静态共享内存

C++ 使用MapViewOfFile分配静态共享内存,c++,winapi,shared-memory,memory-mapped-files,data-segment,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应用程序之间共享的静态共享缓冲区,就像使用 DATAYSEG 时所做的那样

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

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

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

等效的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);

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

实际问题是什么?我们是否应该知道
CreateFileMapping
MapViewOfFile
是什么?@JonathanMee:WinAPI的函数:和。OP:你的目标是什么,与谁分享?您能提供更多的信息吗?我们的目标是创建一个静态共享缓冲区,它在C++和FORTRAN应用程序之间共享,就像使用DATAYSEG时一样。创建动态分配的缓冲区时,FORTRAN会变得很棘手,因为您需要取消引用指针,这也是可行的,但不是我想要的。@user3716892您认为
MapViewOfFile
会更好吗?您仍然有一个指向动态分配内存的指针(在系统分页文件中)。我知道这是如何创建共享文件映射的,但问题是我不想要动态指针(char*buffer)。可能我想要的是不可能的。@user:那没什么意义。这个答案中的指针
buffer
与问题中的
buffer
数组几乎没有区别。如果绝对需要以数组的形式访问文件映射对象,则可以轻松地将指针强制转换为对数组类型的引用。或者简单地索引指针<代码>缓冲区[0]=“A”对于指针和数组是合法的。@ IcTestTaby:你所说的C和C++是正确的,但是记住,OP是询问Fortran的。如果OP在Fortran中访问内存有困难,为什么C或C++中的编译时类型重要?这只是一块内存。在这个问题上,我也不理解文件映射对象和共享段之间的显著区别。两者都在一个地址提供一块内存,这只在运行时才知道。不同的是,FORTRAN中的缓冲区数组可以通过一个公共块来访问,而指针缓冲区需要执行调用才能从C转换。我不想执行调用,因为我正在尝试创建一个只处理变量声明的预编译器。