Форум по Delphi программированию



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 31.05.2018, 17:22
xteam777 xteam777 вне форума
Прохожий
 
Регистрация: 14.03.2016
Сообщения: 32
Версия 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 файла?

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

Последний раз редактировалось xteam777, 31.05.2018 в 18:54.
Ответить с цитированием
  #2  
Старый 01.06.2018, 22:42
xteam777 xteam777 вне форума
Прохожий
 
Регистрация: 14.03.2016
Сообщения: 32
Версия Delphi: RAD XE10
Репутация: 10
По умолчанию

Код работает. Единственное, не получается правильно посчитать смещение в этой строке. Данные битмапа затирают первые 8 байт размера

Код:
MemStream.Read((PByte(pMap) + sizeof(BitmapInfoSize))^, BitmapInfoSize);
Ответить с цитированием
  #3  
Старый 02.06.2018, 11:38
xteam777 xteam777 вне форума
Прохожий
 
Регистрация: 14.03.2016
Сообщения: 32
Версия Delphi: RAD XE10
Репутация: 10
По умолчанию

Опытным путем установлено, что работает вот так:
Код:
MemStream.Read((PByte(pMap) + sizeof(BitmapInfoSize) + 4)^, BitmapInfoSize);

и

Код:
MemStream.Write((PByte(pMap) + sizeof(BitmapInfoSize))^, BitmapInfoSize);

Почему надо прибавить 4 байта к смещению непонимаю.
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:59.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2021

ВКонтакте   Facebook   Twitter   Ссылка на Telegram