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)
что с этим делать??? где искать баг?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.