Показать сообщение отдельно
  #1  
Старый 31.05.2018, 17:22
xteam777 xteam777 вне форума
Прохожий
 
Регистрация: 14.03.2016
Сообщения: 33
Версия Delphi: RAD XE10
Репутация: 10
По умолчанию 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 файла?

И еще вопрос. Как реализовать взаимодействие между процессами так, чтобы небыло одновременно и записи и считывания файла?
Ответить с цитированием