|
#1
|
|||
|
|||
MMF и указатели
Уважаемые. Прошу помощи.
Задача в одном процессе записывать TBitmap в MemoryMappedFile, а в другом считывать. Запись делаю так: Код:
procedure SaveBitmapToMMF; var CurBitmapInfoSize: Integer; begin MemStream.Clear; SaveBitmap.SaveToStream(MemStream); CurBitmapInfoSize := MemStream.size; // CurBitmapInfoSize := PBitmapFileHeader(MemStream.Memory)^.bfOffBits - SizeOf(TBitmapFileHeader) + sizeof(pSize); try if BitmapInfoSize <> CurBitmapInfoSize then begin BitmapInfoSize := CurBitmapInfoSize; UnmapViewOfFile(pMap); //Disposes the mem map if hMap > 0 then CloseHandle(hMap); hMap := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, BitmapInfoSize, PWideChar(WideString('VCS_SCREEN_SESSION_' + IntToStr(CurrentSessionID)))); pMap := MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, BitmapInfoSize + sizeof(BitmapInfoSize)); end; MemStream.Position := 0; CopyMemory(pMap, @BitmapInfoSize, sizeof(BitmapInfoSize)); MemStream.Read((PByte(pMap) + sizeof(BitmapInfoSize))^, BitmapInfoSize); finally // CloseHandle(hMap); end; end; Считывание: Код:
Result := TBitmap.Create; try hMap := OpenFileMapping(FILE_MAP_READ, False, PWideChar(WideString('VCS_SCREEN_SESSION_' + IntToStr(SessionID)))); err := GetLastError; if hMap = 0 then Exit; pMap := MapViewOfFile(hMap,//дескриптор "проецируемого" объекта FILE_MAP_READ,// разрешение чтения/записи 0,0, SizeOf(int64));//размер буфера CopyMemory(@pSize, pMap, SizeOf(int64)); UnmapViewOfFile(pMap); pMap := MapViewOfFile(hMap,//дескриптор "проецируемого" объекта FILE_MAP_READ,// разрешение чтения/записи 0,0, pSize + SizeOf(int64));//размер буфера MemStream := TMemoryStream.Create; MemStream.Write((PByte(pMap) + sizeof(pSize))^, pSize); MemStream.Position := 0; Result.LoadFromStream(MemStream); UnmapViewOfFile(pMap); finally CloseHandle(hMap); end; Как правильно записать в начало размер, а потом содержимое? Сейчас в переменную pSize считывается какой-то мусор. Размер нужен чтобы потом считать сначала размер, а потом уже содержимое. Может есть другой способ определить размер Mapped файла? И еще вопрос. Как реализовать взаимодействие между процессами так, чтобы небыло одновременно и записи и считывания файла? Последний раз редактировалось xteam777, 31.05.2018 в 18:54. |
#2
|
|||
|
|||
Код работает. Единственное, не получается правильно посчитать смещение в этой строке. Данные битмапа затирают первые 8 байт размера
Код:
MemStream.Read((PByte(pMap) + sizeof(BitmapInfoSize))^, BitmapInfoSize); |
#3
|
|||
|
|||
Опытным путем установлено, что работает вот так:
Код:
MemStream.Read((PByte(pMap) + sizeof(BitmapInfoSize) + 4)^, BitmapInfoSize); и Код:
MemStream.Write((PByte(pMap) + sizeof(BitmapInfoSize))^, BitmapInfoSize); Почему надо прибавить 4 байта к смещению непонимаю. |