![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DLL [NT4, Win2k, WinXP]
Wizard © (2003-01-11 12:38:00)есть 2 DLL (назовем X1, X2), каждая из которых юзает в еще одну DLL(назовем ее Y).
Все это в одном процессе
Вопрос: как узнать, из какой DLL(X1 или X2) вызвана функция, которая находится в Y, и сейчас мы находимся в ней...
исходники X1 И X2 недоступны...
Набережных С. (2003-01-11 18:23:00) [1]Удалено модератором
Примечание: Offtopic
Игорь Шевченко (2003-01-11 14:55:00) [2]Количество не влияет.
Для дополнительной раскрутки ищи на www.delphi-jedi.org в разделе JCL unit JCLDebug.pas
Wizard (2003-01-11 13:18:00) [3]Спасибо большое за совет...
но еще один вопрос: когда делаешь описанным способом, то могут появиться дополнительные библиотеки.. как раскрутить стек до своей DLL..
С Уважением Wiz.
Wizard (2003-01-11 13:07:00) [4]а кол-во аргументов влияет на смещение? (ebp + 4)?
Игорь Шевченко (2003-01-11 12:52:00) [5]По стеку. GetModuleHandle("x1"), GetModuleHandle("x2").
Допустим, есть функция в Y.DLL
funciton YMyFunc (I : Integer) : Integer; stdcall;
var
Callee : LongInt;
....
begin
asm
push dword ptr [ebp+4]
pop Callee
end;
.....
end;
Переменная Callee содержит адрес вызывающей функции.
После этого:
function DecodeAddress (AAddress : LongInt) : String;
var
Module : THandle;
ModName : array[0..255] of char;
FileName : String;
begin
Module := FindHInstance(Pointer(AAddress));
GetModuleFileName(Module, ModName, SizeOf(ModName));
FileName := ExtractFileName(ModName);
Result := Format("%s+0x%x", [FileName, Integer(Cardinal(AAddress) - Module)]);
end;
В результате получается строка, состоящая из имени файла и смещения в этом файле на место, откуда была вызвана функция YMyFunc;
Если смещение не нужно, то вместо
Result := Format("%s+0x%x", [FileName, Integer(Cardinal(AAddress) - Module)]);
Можно просто поставить
Result := FileName;
С уважением,