Конференция "WinAPI" » Аналог GetExceptionInformation в Delphi
 
  • 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
 
Конференция "WinAPI" » Аналог GetExceptionInformation в Delphi
Есть новые Нет новых   [134431   +15][b:0][p:0.001]