Выделите статическую общую память, используя MapViewOfFile

Как я могу выделить общую память для статического буфера, как показано ниже, но с использованием 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

Решение

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]