Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Что-то я не могу победить следующий код: на С выглядит так


Alexander ©   (2003-02-03 08:12:00) 


byte * bits = (byte *) malloc(rec.nSize);
if ( bits == NULL )
return FALSE;
...
HENHMETAFILE hEmf = SetEnhMetaFileBits(rec.nSize, bits);


у меня выглядит так:

var
bits: PByte;
hEmf: Cardinal;

bits := SysGetMem(rec.nSize);
...
hEmf := SetEnhMetaFileBits(rec.nSize, PChar(bits));


но при выполнении SetEnhMetaFileBits выскакивает:"Неверная попытка доступа к адресу памяти" (GetLastError)

В чём может быть дело?


MBo   (2003-02-03 12:28:00) [1]

CopyEnhMetaFile


Alexander   (2003-02-03 11:40:00) [2]

Спасибо, с галочкой (bits^) заработало.

как мне теперь эти emf данные записать в обычный emf файл?


MBo   (2003-02-03 09:55:00) [3]

неправильно читал. раскомментируй 140

hFile := CreateFile("e:\5.emf", GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
ToRead:=Min(106852,GetFileSize(hfile,nil) {-140});
GetMem(bits,ToRead);
SetFilePointer(hFile, {140}0, nil, FILE_BEGIN);
ReadFile(hFile, bits^, ToRead, BytesRead, nil);
hEmf := SetEnhMetaFileBits(ToRead, PChar(bits));
PlayEnhMetaFile(Canvas.Handle,hEmf, Rect(0,0,100,100));
DeleteEnhMetaFile(hEmf);


Alexander   (2003-02-03 09:01:00) [4]

Мне нужно прочитать из постороннего файла по заданному адресу, заданное число байт. И вот эти данные засунуть в hEmf.
Читаю данные так:

hFile := CreateFile(PChar(Edit1.Text), GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
SetFilePointer(hFile, 140, nil, FILE_BEGIN);
ReadFile(hFile, bits, 106852, BytesRead, nil);

правда блок великоват и не всегда BytesRead=106852.


MBo   (2003-02-03 08:37:00) [5]

Для какой цели? Загрузку из ресурса можно делать так:

procedure TForm1.Button1Click(Sender: TObject);
var
bits: PByte;
hEmf: Cardinal;
hRes,hData:THandle;
begin
hRes:=FindResource(hInstance,WideString("EMFFILE"),"RT_RCDATA");
hData:=LoadResource(hInstance,hRes);
bits:=LockResource(hData);
hEmf := SetEnhMetaFileBits(SizeOfResource(hInstance,hRes), PChar(bits));
PlayEnhMetaFile(Canvas.Handle,hEmf, Rect(0,0,100,100));
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо