Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Передать Bitmap через проецируемые файлы


Автор: remax 17.11.2008, 02:20
Что-то уперся  smile  в простом казалось бы вопросе: передача данных между программами. 
Задача - есть картинка в одной программе ее надо передать в другую, причем, использовать именно FileMapping.  (Clipboard и обычные файлы не подходят!!!) 

Реализация (сама суть)
Код

var
  hFileMapObj:THandle;  
  lpBaseAddress:^TBitmap;
.....
// Создаем файл, подготавливаем область копирования
hFileMapObj := CreateFileMapping(MAXDWORD,Nil,PAGE_READWRITE,0,size,PAnsiChar('File1'));
lpBaseAddress := MapViewOfFile(hFileMapObj,FILE_MAP_WRITE,0,0,size);
lpBaseAddress^:=TBitmap.Create;

// Копируем картинку
(lpBaseAddress^).Assign(image1.Picture.Bitmap)
....


вторая программа
Код

var
  hFileMapObj:THandle;  
  lpBaseAddress:^TBitmap;
.....
// Открываем файл, подготавливаем область копирования
hFileMapObj := OpenFileMapping(FILE_MAP_READ, FALSE, PAnsiChar('File1'));
lpBaseAddress := MapViewOfFile(hFileMapObj,FILE_MAP_WRITE,0,0,size);

// получаем картинку
image1.Picture.BitMap.Assign(lpBaseAddress^);
//!!!!!!!!!!!!!!!!!! Здесь ошибка времени  выполнения!!!!!!!
....


Как правильно передать картинку посредством FileMapping?

Автор: remax 18.11.2008, 02:45
Нет вариантов?

Автор: dumb 18.11.2008, 04:13
ты как-то странно "картинку передаешь" - в мэппинг засовываешь указатель на TBitmap. с таким же успехом можно было этот указатель в файл записать, потом из другой программы его прочитать и пытаться с ним работать... smile

простой путь, но с оверхедом на лишнее копирование(схематично):
Код

mapview:^byte
memstream=TMemoryStream.Create
bitmap.SaveToStream(memstream)
CreateFileMapping
mapview=MapViewOfFile(...,memstream.size+sizeof(dword)) // или просто фиксированно большой выделить
pdword(mapview)^=memstream.size // в начало мэппинга пишем размер
memstream.position=0
MoveMemory(mapview+sizeof(dword), memstream.memory, memstream.size) // пишем саму картинку
//вынос тела по аналогии


посложнее - создать потомка TCustomMemoryStream в котором буфером назначать мэппинг.

Автор: remax 18.11.2008, 10:27
Да, спасибо - предложенный вариант полностью работоспособный  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)