type
PRasterImageInfo = ^TRasterImageInfo;
TRasterImageInfo = packed record
nSize: DWord;
nItemID: LongInt;
nFlags, nWidth, nHeight, nResSize: DWord;
nResBytes: array[0..0] of Byte;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var
MemStrm: TMemoryStream;
MemSize: DWORD;
hMapping: THandle;
RasterImageInfo: PRasterImageInfo;
begin
if OpenPictureDialog1.Execute then
begin
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
MemStrm := TMemoryStream.Create;
try
Image1.Picture.Bitmap.SaveToStream(MemStrm);
MemSize := (SizeOf(TRasterImageInfo) - 1) + MemStrm.Size;
hMapping := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, MemSize, 'RasterImageInfo');
if hMapping = 0 then RaiseLastOSError;
try
RasterImageInfo := MapViewOfFile(hMapping, FILE_MAP_WRITE, 0, 0, MemSize);
if RasterImageInfo = nil then RaiseLastOSError;
try
RasterImageInfo.nSize := MemSize;
RasterImageInfo.nItemID := 1;
RasterImageInfo.nFlags := $0007;
RasterImageInfo.nWidth := Image1.Picture.Bitmap.Width;
RasterImageInfo.nHeight := Image1.Picture.Bitmap.Height;
RasterImageInfo.nResSize := Strm.Size;
Move(MemSStrm.Memory^, RasterImageInfo.nResBytes[0], Strm.Size);
// run external program, wait for it to finish using RasterImageInfo ...
finally
UnmapViewOfFile(RasterImageInfo);
end;
finally
CloseHandle(hMapping);
end;
finally
MemStrm.Free;
end;
end;