Текущий архив: 2007.02.25;
Скачать: CL | DM;
ВнизНазначение обработчика исключений в 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;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.049 c