EMF, PlayEnhMetaFileRecord, EMRSELECTOBJECT ?
От: Артем Россия  
Дата: 12.01.06 11:22
Оценка:
Ситуация такая: разбираю EMF-файл для перевода его в другой векторный формат(DXF/DWG).

У меня возникли непонятки с EMRSELECTOBJECT

[pascal]
//это часть реализации колбек-функции 
function TEmfPlayer.DoOnProcessEMR(aDC: HDC; pHTable: PHandleTable;
  const pEMFR: PEMR; HTableCount: integer): boolean;
{var ....}
begin
  try
    iT := pEMFR^.iType;
    if iT = EMR_SELECTOBJECT then begin
      //здесь иногда PEMRSelectObject(pEMFR)^.ihObject больше HTableCount (а точнее он равен $80000005)
      //?????????  что с этим делать??? где искать баг? 
      aGDIOBJ := pHTable^.objectHandle[PEMRSelectObject(pEMFR)^.ihObject];
      gdiObjType := GetObjectType(aGDIOBJ);
      if gdiObjType=0 then begin
        fLastErr := IntToStr(GetLastError);// GetLastError возвращает 0
      end;
      //дальше анализирую тип ГДИ объекта и устанавливаю свои внутренние объекты
      case gdiObjType of
        OBJ_BRUSH: begin
          if fBrush.Handle <> aGDIOBJ then SetBrushProps(aGDIOBJ, fBrush);
        end;
        OBJ_PEN  : begin 
          {...}
        end;
        OBJ_FONT : begin{fFontFormed := false;}
          {...}
        end;
        else { OBJ_BITMAP, OBJ_COLORSPACE, OBJ_DC, OBJ_ENHMETADC, OBJ_ENHMETAFILE
               OBJ_EXTPEN, OBJ_MEMDC, OBJ_METAFILE, OBJ_METADC, OBJ_PAL, OBJ_REGION}
        begin
          fLastErr := IntToStr(gdiObjType);
        end;
      end;
{... далее не важно}
[/pascal]


Вобщем вопрос:
иногда PEMRSelectObject(pEMFR)^.ihObject больше HTableCount
(а точнее он равен $80000005, HTableCount =5)
что с этим делать??? где искать баг?
Re: EMF, PlayEnhMetaFileRecord, EMRSELECTOBJECT ?
От: ekamaloff Великобритания  
Дата: 12.01.06 11:33
Оценка:
Здравствуйте, Артем, Вы писали:

А>Вобщем вопрос:

А> иногда PEMRSelectObject(pEMFR)^.ihObject больше HTableCount
А> (а точнее он равен $80000005, HTableCount =5)
А> что с этим делать??? где искать баг?

Очень похоже на отрицательное знаковое целое, приведенное к беззнаковому целому, т.е.

Integer -5 = DWORD $80000005.

Нужно разобраться, почему в TEMRSelectObject пытаются засунуть отрицательное число.

Возможно нужно просто приводить PEMRSelectObject(pEMFR)^.ihObject к Integer и брать модуль
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[2]: EMF, PlayEnhMetaFileRecord, EMRSELECTOBJECT ?
От: Артем Россия  
Дата: 12.01.06 11:48
Оценка:
Здравствуйте, ekamaloff, Вы писали:

E>Очень похоже на отрицательное знаковое целое, приведенное к беззнаковому целому, т.е.


E>Integer -5 = DWORD $80000005.

боюсь что Integer($80000005) = -2147483643 (те MIN_INT-5)
Этож инверсный код.
Но даже если делать (ihObject and $7FFFFFFF) и получить таки 5, то все равно 5 выходит за пределы массива pHTable^.objectHandle ибо HTableCount=5

З.Ы.:
Из MSDN
typedef struct tagEMRSELECTOBJECT {
  EMR   emr; 
  DWORD ihObject;
}

то есть ihObject целое беззнаковое.
Re: EMF, PlayEnhMetaFileRecord, EMRSELECTOBJECT ?
От: MBo  
Дата: 12.01.06 13:31
Оценка: 3 (1) +1
Здравствуйте, Артем, Вы писали:

А> //здесь иногда PEMRSelectObject(pEMFR)^.ihObject больше HTableCount (а точнее он равен $80000005)


Это Stock Object. в данном случае, кажется, NULL_BRUSH

Для получения объекта — обнули старший бит, т.е
GetStockObject(ihObject and $7FFFFFFF)
Re[2]: EMF, PlayEnhMetaFileRecord, EMRSELECTOBJECT ?
От: Артем Россия  
Дата: 12.01.06 13:40
Оценка:
Здравствуйте, MBo, Вы писали:

MBo>Это Stock Object. в данном случае, кажется, NULL_BRUSH


Спасибо! первый раз сталкиваюсь! не подскажете где прочитать общую информацию про сток объекты. в МСДН нарыл пока только константы сток объектов
Re[3]: EMF, PlayEnhMetaFileRecord, EMRSELECTOBJECT ?
От: MBo  
Дата: 12.01.06 14:05
Оценка:
Здравствуйте, Артем, Вы писали:

А>Здравствуйте, MBo, Вы писали:


MBo>>Это Stock Object. в данном случае, кажется, NULL_BRUSH


А>Спасибо! первый раз сталкиваюсь! не подскажете где прочитать общую информацию про сток объекты. в МСДН нарыл пока только константы сток объектов



http://www.kbalertz.com/Q142319/Decipher.Records.Enhanced.aspx
http://cvs.winehq.com/cvsweb/wine/objects/Attic/enhmetafile.c?rev=1.51

кое-что в книге Фень Юаня есть.
Re[4]: EMF, PlayEnhMetaFileRecord, EMRSELECTOBJECT ?
От: Артем Россия  
Дата: 12.01.06 14:07
Оценка:
>MBo, спасибо большое!!!! //фень юань есть ща проштудирую
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.