![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать какая программа загрузила мою DLL? [D6, NT4, Win2k, WinXP]
VBill © (2002-03-19 16:55:00)Как узнать какая программа загрузила мою DLL?
Надо получить о ней хоть какую нибудь информацию - HANDLE or имя файла or и т.д.
Digitman (2002-03-20 16:25:00) [21]>Dimka Maslov
Я не проверял, но ! Если библ-ку динамически востребовал additional thread некоего процесса ?
Dimka Maslov (2002-03-20 15:22:00) [22]Всё о-о-о-чень просто. Для того, чтобы узнать имя процесса, загрузившего библиотеку, достаточно воспользоваться стандартной функцией ParamStr(0). Это даст правильный результат даже если бибиотека используется из MSVC++!
Digitman (2002-03-20 09:38:00) [23]Points to a procedure invoked by a DLL entry point.
Unit
System
Category
miscellaneous routines
var DLLProc: Pointer;
Description
DLLProc is used to specify a procedure that is invoked every time a DLL"s entry point is called. A procedure assigned to DLLProc must take one parameter of type Integer. For example,
procedure LibraryProc(Reason: Integer);
When the procedure is invoked, this single parameter contains a value between 0 and 3 as defined by the following group of constants in the Windows unit.
const
DLL_PROCESS_DETACH = 0;
DLL_PROCESS_ATTACH = 1;
DLL_THREAD_ATTACH = 2;
DLL_THREAD_DETACH = 3;
For further details on the meaning of these constants, refer to the description of the DllEntryPoint function in the Win32 API online help.
Note: DLL_PROCESS_ATTACH is passed to the procedure only if the DLL’s initialization code calls the procedure and specifies DLL_PROCESS_ATTACH as a parameter.
---------------------------------------------------------------
Резюме :
в теле DllProc (см.хэлп, как ее "перехватить") с параметром DLL_PROCESS_ATTACH или DLL_THREAD_ATTACH достаточно вызвать MainThreadId или GetCurrentThreadId, чтобы, получив Id процесса/потока, использовать этот Id для получения инф-ции о процессе/потоке, "подключившемся" к твоей DLL.
paul_shmakov (2002-03-20 01:42:00) [24]2 Dimka Maslov:
насчет обычного $400000 - не правда, для получения этого числа нужно использовать GetModuleHandle(nil)
Виктор Щербаков (2002-03-19 17:34:00) [25]
> причина вызова функции (насколько я помню).
Чего ж еще нужно? Если причина вызова DllMain- проецирование dll в адресное пространство процесса, то исследуй наздоровье загрузивший dll процесс например так: Dimka Maslov © (19.03.02 17:21)
VBill (2002-03-19 17:30:00) [26]Виктор Щербаков
До задания вопроса изучил DllProc и ничего интересного там не нашел - HMODULE DLLки и причина вызова функции (насколько я помню).
Dimka Maslov
Попробую.
>Обычно hInstance ...
А если нет ?)
Dimka Maslov (2002-03-19 17:21:00) [27]Обычно hInstance основного модуля в процессе равен $00400000 (если его Image Base не переопределён программистом, создавшим его). Этим и можно воспользоваться для определении пути к программе, загрузившей динамическую библиотеку.
function GetApplicationName: string;
var
Buffer: array [0..MAX_PATH-1] of
begin
GetModuleFileName($00400000, @Buf[0], SizeOf(Buffer));
Result:=PChar(@Buf[0]);
end;
Виктор Щербаков (2002-03-19 17:12:00) [28]Тогда смотри в хэлпе DllProc.
Но лучше почитать у Рихтера про DllMain.
VBill (2002-03-19 17:06:00) [29]Это которые CreateToolhelp32Snapshot и т.д?? Тогда
1. WinNT 4.0 Unsupported
2. Какая именно функция??
Мне надо в момент загрузки DLL (не обязательно при загрузке, но имхо в другое время не получится точно) узнать какая прога ее загружает.
Виктор Щербаков (2002-03-19 17:00:00) [30]Смотри Tool Help Functions.