Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2012.05.06;
Скачать: [xml.tar.bz2];

Вниз

Аналог 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2012.05.06;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.002 c
15-1325422003
Димка На
2012-01-01 16:46
2012.05.06
mode в линуксе


2-1325795317
Gu
2012-01-06 00:28
2012.05.06
stdcall


2-1325978911
Gu
2012-01-08 03:28
2012.05.06
Exception dll


2-1325855150
Anthony
2012-01-06 17:05
2012.05.06
Иконка для приложения


15-1325361710
Anatoly Podgoretsky
2012-01-01 00:01
2012.05.06
С Новым Годом





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский