Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.09.16;
Скачать: [xml.tar.bz2];

Вниз

Чтение 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 7.234 c
2-1187865942
race1
2007-08-23 14:45
2007.09.16
Наследник сервиса и его использование


2-1187873730
Алла_И
2007-08-23 16:55
2007.09.16
Копирование через Pointer


2-1187721247
malyar
2007-08-21 22:34
2007.09.16
indiclient.lastcmdresult


15-1187442256
Ricks
2007-08-18 17:04
2007.09.16
Еще немного прикольного видео


15-1187695864
ZeroDivide
2007-08-21 15:31
2007.09.16
Delphi -> BDS -> RS





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский