Как я могу выделить общую память для статического буфера, как показано ниже, но с использованием 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 становится хитрым, потому что вам нужно отменить ссылку на указатель, что также выполнимо, но это не то, что я хочу.
Эквивалентные вызовы 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()
сопоставляет доступ к памяти в вызывающем процессе с этим объектом. Таким образом, оба приложения используют общую память друг с другом. Когда одно приложение записывает данные в объект, другое приложение увидит его.
Других решений пока нет …