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

Вниз

Назначение обработчика исключений в Dll.   Найти похожие ветки 

 
Riply ©   (2007-02-05 07:07) [0]

Здравствуйте !
Никак не укладывается в голове следующее:
При инициализации SysUtils назаначает свой класс
и свой бработчик искл. ситуаций: ErrorProc, ExceptProc, ExceptionClass, и т. д.
А при деинициализации всех их "обниливает" :) Вроде все понятно.
Но при попытке себе представить как это работает в подгружаемой (и выгружаемой) DLL
все становиться с ног наголову :(
Ну еще можно согласиться, что подгрузившись к процессу мы назначаем свои обработчики
(хотя может они его и не устраивают), но совсем не понятно,
что в конце их "обниливаем", а не, например, возвращаем старые значения, которые были до нас.
Или у каждой DLL - ки персональные обработчики с которыми она вольна поступать как хочет ?
Тогда как это реализуется ? Ведь некоторые переменные - глобально объявлены в System. ?


 
Джо ©   (2007-02-05 07:12) [1]

В Dll линкуется свой System, со своими «глобальными переменными». И свой SysUtils, если он используется. В общем, лично я вопроса не понял. :)


> Или у каждой DLL - ки персональные обработчики с которыми
> она вольна поступать как хочет ?

Ну, в общем, да :)


 
Riply ©   (2007-02-05 07:31) [2]

>[1] Джо ©   (05.02.07 07:12)
>Ну, в общем, да :)
Спасибо.
Т.е. в своей Dll -ке я могу издеваться
над обработчиками и др. "глобальными" переменными как угодно
и не бояться помешать никому ?


 
Riply ©   (2007-02-05 10:39) [3]

А как можно в DLL, например ErrorProc, присвоить значение из
процесса в который мы загрузились ?


 
Игорь Шевченко ©   (2007-02-05 12:36) [4]

Riply ©   (05.02.07 10:39) [3]

Передать адрес в DLL


 
Riply ©   (2007-02-05 12:47) [5]

>[4] Игорь Шевченко ©   (05.02.07 12:36)
А самой Dll - ке как узнать адрес, не обременяя Процесс своими нескромными просьбами ? :)


 
MetalFan ©   (2007-02-05 12:57) [6]


> Riply ©   (05.02.07 12:47) [5]

эт какэто необременяя процесс? а код из длл по вашему где исполняется?


 
Riply ©   (2007-02-05 13:04) [7]

> [6] MetalFan ©   (05.02.07 12:57)
>а код из длл по вашему где исполняется?
В адресном пространстве процесса.
Ну и как мне, находясь там узнать аресс ErrorProc процесса ?
Если он свой, то он может "Передать адрес в DLL", а если нет ?


 
Riply ©   (2007-02-05 13:05) [8]

Извините. "аресс" читать - адрес


 
umbra ©   (2007-02-05 13:38) [9]


> Ну и как мне, находясь там узнать аресс ErrorProc процесса
> ?

значение регистра FS - это адрес структуры ТЕВ (thread information block). Первые 4 байта этой структуры - адрес структуры EXCEPTION_REGISTRATION, в которой есть указатель на обработчик ошибок. Есть отличная статья на эту тему - http://www.microsoft.com/msj/0197/exception/exception.aspx
И еще о том же - http://www.jorgon.freeserve.co.uk/ExceptFrame.htm


 
Leonid Troyanovsky ©   (2007-02-05 17:55) [10]


> Riply ©   (05.02.07 07:07)  

> все становиться с ног наголову :(

Полезно, для начала, прочитать раздел
Exceptions and runtime errors in DLLs.

--
Regards, LVT.


 
Riply ©   (2007-02-05 19:37) [11]

>[9] umbra © (05.02.07 13:38)
Спасибо. Посмотрела статьи. Но мне, еще две недели назад искавшей книжку
по ассемблеру для "абсолютных чайников", они принесли мало пользы.
Все, что я оттуда вынесла - попробовала оформить ввиде следующей функции :
По замыслу она должна вернуть список указателей на "ExceptionHandlers"
type
PEXCEPTION_REGISTRATION_RECORD = ^EXCEPTION_REGISTRATION_RECORD;
EXCEPTION_REGISTRATION_RECORD = record
 pNext: PEXCEPTION_REGISTRATION_RECORD;
 pHandler: Pointer;
end;

function EnumHandlers(const hProc: THandle; const pTibAddr: Pointer; List: TList): Boolean;
const
SEARCH_END = MAXDWORD;
var
cbReturn: DWord;
NtTib: TNtTib;
ExceptRec: EXCEPTION_REGISTRATION_RECORD;
pTmp: Pointer;
begin
FillChar(ExceptRec, SizeOf(EXCEPTION_REGISTRATION_RECORD), 0);
if ReadProcessMemory(hProc, pTibAddr, @NtTib, SizeOf(TNtTib), cbReturn) then
 if ReadProcessMemory(hProc, NtTib.ExceptionList, @ExceptRec,
                      SizeOf(EXCEPTION_REGISTRATION_RECORD), cbReturn) then
  begin
   List.Add(ExceptRec.pHandler);
   while DWord(ExceptRec.pNext) <> SEARCH_END do
    begin
     pTmp := ExceptRec.pNext;
     if not ReadProcessMemory(hProc, pTmp, @ExceptRec,
                              SizeOf(EXCEPTION_REGISTRATION_RECORD), cbReturn) then Break;
     List.Add(ExceptRec.pHandler);
    end;
  end;
Result := DWord(ExceptRec.pNext) = SEARCH_END;
end;

И то я не знаю как получить указатель (pTibAddr) на TTeb.Tib :(
Так что не тестировала :)
P.S. Надеюсь не абсолютный бред :)

>[10] Leonid Troyanovsky © (05.02.07 17:55)
>Полезно, для начала, прочитать раздел
>Exceptions and runtime errors in DLLs.
Bмеется ввиду раздел из Help-а к Delphi ?


 
Leonid Troyanovsky ©   (2007-02-05 21:31) [12]


> Riply ©   (05.02.07 19:37) [11]

> >Exceptions and runtime errors in DLLs.
> Bмеется ввиду раздел из Help-а к Delphi ?


Конечно.
Читать про SEH в начале пути стоит лишь для общего развития,
бо дельфи-рантайм транслирует SEH в VCL exceptions, пригодные
для обычного дельфийского использования (не распознанные
рантаймом обычными try -except/finally пропускаются).

Про взаимодействие же с другими языковыми средами в той
статье тоже упомянуто.

--
Regards, LVT.


 
Riply ©   (2007-02-07 09:46) [13]

Вычитала, что у Dll - ки, откомпелированной с RunTime пакетами,
"единые SysUtils и System с процессом, загрузившим ее,
и как следствие, единые обработчики исключений"
Так ли это ?
"единые SysUtils" - а если у нее вообще нет SysUtils ?


 
Leonid Troyanovsky ©   (2007-02-07 10:31) [14]


> Riply ©   (07.02.07 09:46) [13]

> "единые SysUtils и System с процессом, загрузившим ее,
> и как следствие, единые обработчики исключений"


Почитай-ка лучше http://softwarer.ru/packages.html

Ну, а, прежде всего, надо решить нужна ли dll.
Есть к тому уважительные причины?

--
Regards, LVT.


 
Сергей М. ©   (2007-02-07 10:35) [15]


> Так ли это ?


Да, это так, если хост-приложение также собрано с теми же RunTime пакетами.


> "единые SysUtils" - а если у нее вообще нет SysUtils ?
>


Значит в ней нельзя воспользоваться удобствами класса Exception и его наследников.


 
Riply ©   (2007-02-07 12:46) [16]

>[15] Сергей М. © (07.02.07 10:35)
Спасибо.
>[14] Leonid Troyanovsky © (07.02.07 10:31)
>Ну, а, прежде всего, надо решить нужна ли dll.
>Есть к тому уважительные причины?
На данном этапе (есть немного свободного времени) я пытаюсь
выйти с уровня "батонокидателя". Сама ставлю себе задачу и решаю ее.
Сейчас глобальная задача такова:
Попробовать написать Dll, использующию для обработки исключений
обработчики "хост процесса". (В идеале не обязательно своего)
Так что, исходя из условия задачи, Dll - нужна :)


 
Сергей М. ©   (2007-02-07 12:56) [17]


> написать Dll, использующию для обработки исключений
> обработчики "хост процесса". (В идеале не обязательно своего)


Скажи на милость, ну откуда же "чужому" приложению знать, как обрабатывать твои исключения ?
За свои он отвечает сам, а за свои уж будь любезна позаботиться сама - кому как не тебе знать, что делать в рез-те того или иного исключения ...


 
Riply ©   (2007-02-07 13:14) [18]

> [17] Сергей М. ©   (07.02.07 12:56)
Плохо сформулировала :(
Я хочу чтобы вместо моих ExceptProc, ErrorProc вызывались
соответствующие процедуры процесса. (Если это возможно).


 
Leonid Troyanovsky ©   (2007-02-07 13:39) [19]


> Riply ©   (07.02.07 12:46) [16]

> Попробовать написать Dll, использующию для обработки исключений
> обработчики "хост процесса". (В идеале не обязательно своего)


На мой взгляд, свое свое свободное время можно потратить
более продуктивно.

Dll в классическом виде - рудиментарная  форма клиент-серверных
приложений, где сервер - библиотека является PE, загружаемый
в адресное пространство клиента - процесса.

Когда-то предполагалось, что она может стать неким компонентом
приложений, инвариантным к языку, на котором она создавалась.
Однако, многочисленные технические трудности, а также учитывая то,
что генеральная линия пошла мимо, "настоящие" библиотеки свое
изначальное назначение потеряли.

Поэтому, стоило б больше внимание уделить хотя бы COM или,
если решительней - то .NET

Ну, а по поводу разделения  обработчиков библиотекой и
екзешником можно сказать, что особого смысла в этом нет,
потому, как даже модели обработки сообщений у них могут
быть разными.

--
Regards, LVT.


 
Сергей М. ©   (2007-02-07 13:48) [20]


> хочу чтобы вместо моих ExceptProc, ErrorProc вызывались
> соответствующие процедуры процесса


Это невозможно. ExceptProc, ErrorProc - указатели на функции, специфичные именно для Делфи. Хост-приложение не обязано быть Делфи-приложением. потому оно в общем случае ничего не знает ни про какие TObject и иже с ними.

А даже если это было бы возможно, как, по-твоему, не-Дельфийское хост-приложение должно обрабатывать специфичные для Делфи исключения ?


 
Riply ©   (2007-02-07 14:56) [21]

>[19] Leonid Troyanovsky ©   (07.02.07 13:39)
>[20] Сергей М. ©   (07.02.07 13:48)
Эх. Такую задачу... и так на корню  :)



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

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

Наверх





Память: 0.51 MB
Время: 0.055 c
2-1170944748
Цукор5
2007-02-08 17:25
2007.02.25
Excel


15-1170545984
SergantSA
2007-02-04 02:39
2007.02.25
Помогите найти книгу


3-1165066951
Express
2006-12-02 16:42
2007.02.25
Получить свойство столбцов


2-1170925985
kilop
2007-02-08 12:13
2007.02.25
как создать и вывести на форму Label


15-1170403007
Frosja
2007-02-02 10:56
2007.02.25
HELP





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский