Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.16;
Скачать: CL | DM;

Вниз

Чтение wmf   Найти похожие ветки 

 
Gydvin ©   (2007-08-24 07:43) [0]

Немогу понять где обшибка (( гляньте плз кто небуть

function MFDumpCallBack(H: HDC; HT: PHandletable; MFRec: pEnhMetaRecord; cnt: Integer; Data: Pointer): Integer;
begin
 case MFREC^.iType of   //    AV на этой строке
   EMR_GDICOMMENT:
     begin
{закоментированный код}
     end;
 end;
  result:=1;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 wmf: tmetafile;
 ft: string;
 RShow: trect;
begin
 if opendialog1.Execute and fileexists(opendialog1.FileName) then
 begin
   wmf := tmetafile.Create;
   wmf.LoadFromFile(opendialog1.FileName);
   ft := "";
   EnumEnhMetafile(0, wmf.Handle, @MFDumpCallBack, @FT, RShow);
  // memo1.Text := ft;
   wmf.Free;
 end;
end;


 
alshtam ©   (2007-08-24 07:47) [1]

а вчем ошибка компилятор не ругается (какая проблема то)


 
MBo ©   (2007-08-24 07:52) [2]

в колбэке stdcall явно не хватает


 
Gydvin ©   (2007-08-24 07:53) [3]

Нет. Просто AV at address xxxxxxx in module in progect1.exe. read of address 0000000


 
Gydvin ©   (2007-08-24 07:54) [4]


> MBo ©   (24.08.07 07:52) [2]

Ой точно. Спасибо


 
Gydvin ©   (2007-08-24 08:35) [5]

И еще вопрос, если можно. Так сказать для общего развития. Просьба пояснить происходящие в нижепредставленном рабочем коде процессы.

PEnhMetaRecord = ^TEnhMetaRecord;
tagENHMETARECORD = packed record
   iType: DWORD;
   nSize: DWORD;
   dParm: array[0..0] of DWORD;   {конкретно интересует это, что сие значит. и если не ошибаюсь тут четыре байта}
 end;
TEnhMetaRecord = tagENHMETARECORD;

____________________________________________

tagEMRTEXT = packed record
   ptlReference: TPoint;
   nChars: DWORD;
   offString: DWORD; { Offset to the string}
   fOptions: DWORD;
   rcl: TRect;
   offDx: DWORD;     { Offset to the inter-character spacing array.}
                     { This is always given.}
 end;
 TEMRText = tagEMRTEXT;

tagEMR = packed record
   iType: DWORD;
   nSize: DWORD;
             
 end;
 TEMR = tagEMR;

PEMRExtTextOut = ^TEMRExtTextOut;
tagEMREXTTEXTOUTA = packed record
   emr: TEMR;
   rclBounds: TRect;    
   iGraphicsMode: DWORD;
   exScale: Single;      
   eyScale: Single;      
   emrtext: TEMRText;    
 end;
TEMRExtTextOut = tagEMREXTTEXTOUTA;


.........

function MFDumpCallBack(H: HDC; HT: PHandletable; MFRec: pEnhMetaRecord; cnt: Integer; Data: Pointer): Integer; stdcall;
var
 PS: PChar;
 PW: PWideChar;
begin
 case MFREC^.iType of
   EMR_EXTTEXTOUTW:
     begin
       with PEMREXTTEXTOUT(MFREC)^      {ну и здесь, как можно структуру описанную 12 байтами привести к структуре описанной как минимум 27 (больше не считал) байтами. Возможно, что я ошибаюсь. Просьба пояснить, что тут происходит.}
do
       begin
         PS := PCHAR(MFREC);
         PS := PS + emrtext.offString;
         PW := PWideChar(PS);
         string(Data^) := string(Data^) + WideCharLenToString(PW, emrtext.nChars) + #13#10;
       end;
     end;
 end;


 
MBo ©   (2007-08-24 08:48) [6]

>dParm: array[0..0] of DWORD;   {конкретно интересует это, что сие значит. и если не ошибаюсь тут четыре байта}

Запись переменной длины  nSize

>ну и здесь, как можно структуру описанную 12 байтами привести к структуре описанной как минимум 27 (больше не считал) байтами

именно переменная длина позволяет это делать


 
Gydvin ©   (2007-08-24 09:13) [7]


> >dParm: array[0..0] of DWORD;   {конкретно интересует это,
>  что сие значит. и если не ошибаюсь тут четыре байта}Запись
> переменной длины  nSize


Тоесть dParm: array[0..0] of DWORD это начало первого двойного слова (4 байта) из цепочки длиной указанной в nSize? Несовсем понятно как технически происходит хранение данных в dParm. Или получаем адрес первого слова в памяти, а затем копируем копируем всю цепочку? Тогда вопрос что мешает проге записать, что-либо поверх, так как размеры структуры не указаны явно. Опять предположение, что необходимо жестко выделять память (getmem) и самому прописывать смещение каждой последущей структуры относительно предыдущей. Короче в голове каша.


 
MBo ©   (2007-08-24 09:23) [8]

emf-файл:
заголовок
запись1
тип
размер данных
данные
запись2
тип
размер данных
данные

память под каждую запись уже выделена.


 
Gydvin ©   (2007-08-24 09:51) [9]

Тоесть если я создам такой код, он адекватно пробежит по записям?

procedure TForm1.Button3Click(Sender: TObject);
var
 stream: tstream;
 rec: PEnhMetaRecord;
 x: integer;
begin
 stream := tfilestream.Create("my.wmf", fmopenread);
//после прочтения заголовка
 for x := 0 to кол - во записей - 1 do
   stream.Read(rec, sizeof(rec));
 stream.Free;
end;


 
MBo ©   (2007-08-24 10:50) [10]

>он адекватно пробежит по записям?
нет, конечно.
во-первых, sizeof(rec)) = 4 (размер указателя), но даже и при использовании
SizeOf(TEnhMetaRecord) будет не то,что нужно - размер всегда надо брать из nSize


 
Gydvin ©   (2007-08-24 11:10) [11]


> во-первых, sizeof(rec)) = 4 (размер указателя),

а ну да, конечно.

Так?

var
 stream: tstream;
 rec: tEnhMetaRecord;
 x, a, b: integer;
begin
 stream := tfilestream.Create("my.wmf", fmopenread);
//после прочтения заголовка
 for x := 0 to кол - во записей - 1 do
 begin
   a := stream.Position;
   stream.Read(rec, sizeof(rec));
   b:=(rec.nSize-1)*sizeof(dword);
   stream.Position:=a;
   stream.Read(rec, sizeof(rec)+b);
 end;
 stream.Free;



Страницы: 1 вся ветка

Текущий архив: 2007.09.16;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.028 c
15-1187598333
Наташа
2007-08-20 12:25
2007.09.16
Обращение к мадератором


4-1174744851
Ma[X]iM
2007-03-24 17:00
2007.09.16
Загрузка процессора


2-1187943014
nikfel
2007-08-24 12:10
2007.09.16
Сравнение файлов


15-1187418761
systopler
2007-08-18 10:32
2007.09.16
Ошибка при открытии DLL-ки


2-1187631898
b86
2007-08-20 21:44
2007.09.16
научите меня как работает dragdrop