Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.05.06;
Скачать: CL | DM;

Вниз

Аналог GetExceptionInformation в Delphi   Найти похожие ветки 

 
GreyWolf   (2009-10-24 16:07) [0]

Подскажите пожалуйста кто знает, как в обработчике except блока try..except получить структуру, которую возвращает макрос GetExceptionInformation в MS Visual Studio. Пробовал объявить

type
 PExceptionPointers = ^TExceptionPointers;

function GetExceptionInformation: PExceptionPointers; stdcall; external "kernel32.dll";

, но такой функции не было найдено в kernel32.dll. Для Delphi очевидно должен существовать свой способ.


 
clickmaker ©   (2009-10-26 11:02) [1]

а что в этой структуре?

в дельфи есть ExceptObject()


 
GreyWolf   (2009-10-26 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.


 
Сергей М. ©   (2009-10-26 12:28) [3]


> GreyWolf


Пляши от type ф-ции RaiseList


 
GreyWolf   (2009-10-26 20:14) [4]


> Сергей М. ©   (26.10.09 12:28) [3]

Спасибо за наводку, структура получена через PRaiseFrame(RaiseList)^.ExceptionRecord.
Я поэкспериментировал и обнаружил, что даже при использовании
Win32 API function RaiseException, Exception представляет из себя объект EExternalException. Я так понял, что Delphi инсталлирует обработчик исключений и даже при системных исключениях создает объект Exception. Не знаете, этот механизм где-то описан?


 
Rouse_ ©   (2009-10-28 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



Страницы: 1 вся ветка

Текущий архив: 2012.05.06;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.007 c
2-1325903132
Gu
2012-01-07 06:25
2012.05.06
имена функций длл


15-1325500426
Делфиец
2012-01-02 14:33
2012.05.06
win7 64 выполнить от имени администратора


2-1325846321
Марат
2012-01-06 14:38
2012.05.06
Как открыть лист Excel


2-1326069317
Gu
2012-01-09 04:35
2012.05.06
x64 str


15-1325149872
ЛЕГЕНДА
2011-12-29 13:11
2012.05.06
клик мышкой при наведение на врага