Вот фрагмент кода из файла с отображением в памяти, который мы используем для передачи живого видео (без сжатия) между нашими приложениями, SecurityDescriptor не нужен, но я оставил его, и CreateWorldAccessDescriptor - одна из наших функций.
Если вам необходимо использовать этот тип системы для управления обменом сообщениями между службами и приложениями или приложениями, работающими с разными учетными данными пользователя, убедитесь, что вы запускаете FileName с «Global \»
procedure TRawFeedImageQueue.CreateFileMap;
var
SysInfo: TSystemInfo;
sd: TSecurityDescriptor;
begin
GetSystemInfo( SysInfo );
MapGranularity := SysInfo.dwAllocationGranularity;
MapSize := sizeof( TRawFeedImageQueueData );
FSecObjOk := CreateWorldAccessDescriptor( sd, GENERIC_ALL );
FileMappingHandle := CreateFileMapping( $FFFFFFFF, @sd, PAGE_READWRITE OR SEC_COMMIT, 0, MapSize and $FFFFFFFF, PChar(FFileName) );
if FileMappingHandle <> 0 then
begin
MapView := MapViewOfFile( FileMappingHandle, FILE_MAP_ALL_ACCESS, 0, 0, MapSize );
end
else
begin
MapView := nil;
end;
end;
procedure TRawFeedImageQueue.ReleaseFileMap;
begin
if FileMappingHandle <> 0 then
begin
unMapViewOfFile( MapView );
CloseHandle( FileMappingHandle );
end;
end;
Надеюсь, это немного поможет.
Обновление
Этот код просто создает MapView для файла всего файла, и только в одном представлении вы, конечно, можете создать несколько меньших представлений для одного и того же файла.