Ситуация такая: разбираю 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)
что с этим делать??? где искать баг?
Здравствуйте, Артем, Вы писали:
А>Вобщем вопрос: А> иногда 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
Здравствуйте, ekamaloff, Вы писали:
E>Очень похоже на отрицательное знаковое целое, приведенное к беззнаковому целому, т.е.
E>Integer -5 = DWORD $80000005.
боюсь что Integer($80000005) = -2147483643 (те MIN_INT-5)
Этож инверсный код.
Но даже если делать (ihObject and $7FFFFFFF) и получить таки 5, то все равно 5 выходит за пределы массива pHTable^.objectHandle ибо HTableCount=5
Здравствуйте, Артем, Вы писали:
А>Здравствуйте, MBo, Вы писали:
MBo>>Это Stock Object. в данном случае, кажется, NULL_BRUSH
А>Спасибо! первый раз сталкиваюсь! не подскажете где прочитать общую информацию про сток объекты. в МСДН нарыл пока только константы сток объектов