Уважаемые. Прошу помощи.
Задача в одном процессе записывать 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 файла?
И еще вопрос. Как реализовать взаимодействие между процессами так, чтобы небыло одновременно и записи и считывания файла?