-
GreyWolf (24.10.09 16:07) [0]Подскажите пожалуйста кто знает, как в обработчике except блока try..except получить структуру, которую возвращает макрос GetExceptionInformation в MS Visual Studio. Пробовал объявить
type
PExceptionPointers = ^TExceptionPointers;
function GetExceptionInformation: PExceptionPointers; stdcall; external 'kernel32.dll';
, но такой функции не было найдено в kernel32.dll. Для Delphi очевидно должен существовать свой способ. -
clickmaker © (26.10.09 11:02) [1]а что в этой структуре?
в дельфи есть ExceptObject() -
GreyWolf (26.10.09 12:04) [2]Я хочу получить структуру, описанную в win32sdk:
typedef struct _EXCEPTION_POINTERS { // exp
PEXCEPTION_RECORD ExceptionRecord;
PCONTEXT ContextRecord;
} EXCEPTION_POINTERS;
, чтобы получить оттуда ExceptionRecord, откуда можно узнать параметры исключения:
typedef struct _EXCEPTION_RECORD { // exr
DWORD ExceptionCode;
DWORD ExceptionFlags;
struct _EXCEPTION_RECORD *ExceptionRecord;
PVOID ExceptionAddress;
DWORD NumberParameters;
DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD;
пытаюсь так:
try
...
except
on E: Exception do
begin
...
end;
else begin
P := GetExceptionInformation.ExceptionRecord;//как это осуществить???
....
end;
Идея в том, чтобы диагностировать ошибку, даже если это не Delphi Exception.
Посмотрел справку на ExceptObject (Delphi 7) - немного не то. Возвращает нетипизированный TObject, а что там, можно узнать только через ExceptionErrorMessage. Я хотел получить доступ к структуре EXCEPTION_RECORD. -
Сергей М. © (26.10.09 12:28) [3]
> GreyWolf
Пляши от type ф-ции RaiseList -
GreyWolf (26.10.09 20:14) [4]
> Сергей М. © (26.10.09 12:28) [3]
Спасибо за наводку, структура получена через PRaiseFrame(RaiseList)^.ExceptionRecord.
Я поэкспериментировал и обнаружил, что даже при использовании
Win32 API function RaiseException, Exception представляет из себя объект EExternalException. Я так понял, что Delphi инсталлирует обработчик исключений и даже при системных исключениях создает объект Exception. Не знаете, этот механизм где-то описан? -
Rouse_ © (28.10.09 15:48) [5]EExternalException создается вызовом функции GetExceptionObject из SysUtils, которую в свою очередь вызывает процедура _HandleAnyException из System.
В том-же SysUtils есть массив типов исключений ExceptMap, базирующийся на перечислимом типе TRuntimeError из System
Если посмотришь внимательно реализацию GetExceptionObject, то увидишь что создания исключения класса EExternalException является лиш частным случаем.
Ну и по поводу PCONTEXT ContextRecord его ты не получишь, т.к. на него попросту забили в том-же HandleAnyException. В самой процедуре даже коментарий есть:
{ -> [ESP+ 4] excPtr: PExceptionRecord }
{ [ESP+ 8] errPtr: PExcFrame }
{ [ESP+12] ctxPtr: Pointer }
{ [ESP+16] dspPtr: Pointer }
{ <- EAX return value - always one }
хотя на самом деле [ESP+12] это и есть PCONTEXT, а [ESP+16] не что иное как pDispatcherContex