| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > получить HINSTANCE процесса |
| Автор: jhonyxakep 27.9.2011, 13:04 |
| Писал программку, которая перехватывает выполнение Dll функций на себя. Для перехвата требуется HINSTANCE процесса, само собой получить его внутри самой-же программы несложно, а вот как получить HINSTANCE другого приложения? Пробовал использовать GetWindowLong но она вроде возвращает только HINSTANCE окна, так что... |
| Автор: Snowy 27.9.2011, 14:07 |
| Может я чего-то не так понял, но обычно для перехвата нужен HINSTANCE твоей dll. Для чего тебе может потребоваться HINSTANCE чужого процесса - не представляю... |
| Автор: CodeMonkey 27.9.2011, 15:44 |
| Не существует такой вещи как HINSTANCE процесса. У процесса есть ID (PID) и опционально - несколько открытых описателей (Handle). HINSTANCE - это описатель исполняемого модуля. Коих в одном процессе загружено несколько. Как минимум - .exe и kernel32. |
| Автор: jhonyxakep 28.9.2011, 02:56 |
| Хмм незнал.. Вот мне надо перехватывать обращение к одной из функций библиотеки BASS. Какой для этого надо HINSTANCE пихать? И где его взять? |
| Автор: CodeMonkey 28.9.2011, 03:03 |
| Странный вопрос. "Мне надо повесить картину - какую брать табуретку?" Какая связь между A и Б? Может она есть, а может и нет. Как вы собираетесь ставить ловушку? И, главное, зачем вообще надо ставить ловушку на BASS? |
| Автор: jhonyxakep 28.9.2011, 07:22 | ||||
Находил в тырьнете юнит небольшой... А может и большой, вообщем вот:
Особо не разбирался что тут. Функция InterceptDllCall позволяет ставить что-то типа хука на это дело. Вот я и пытался начать хотябы с мессадж бокса
Если передавать первым параметром hInstance своего приложения, то у меня успешно вызывается функция MyMessageBox, иначе вообще глухо. Хочу расширить возможности одного приложения. |
| Автор: bems 28.9.2011, 07:43 |
| Конкретно эта функция хочет HMODULE дллки в твоём процессе. То есть давай ей результат вызова LoadLibrary/GetModuleHandle |
| Автор: jhonyxakep 28.9.2011, 09:12 |
| Ээм, но мне надо перехватывать все это дело из другого процесса... |
| Автор: bems 28.9.2011, 09:37 |
| Эта функция действует сугубо в текущем процессе. Если нужно в чужом, ты можешь инжектить туда длл и вызывать функу уже в контексте чужого процесса |
| Автор: jhonyxakep 28.9.2011, 10:54 |
| Дауж, не самый приятный путь. Ладно, буду пробовать. Есть ссылочки на РТФМ по этой теме? |
| Автор: bems 28.9.2011, 11:23 |
| http://forum.vingrad.ru/act-Search/CODE/show/searchid-00ae4f6163b5838e9f30c3562316fd62/search_in-posts/result_type/topics/flag/search/highlite/inject/index.html |
| Автор: jhonyxakep 28.9.2011, 11:58 |
| Всетаки под ссылками я имел в виду полноценные мануалы |
| Автор: CodeMonkey 28.9.2011, 15:39 | ||||
| function InterceptDllCall( hLocalModule:HModule; // <- функции в каком модуле хучить. Если exe - то MainInstance или GetModuleHandle(nil). Если это DLL, то GetModuleHandle('MyDll.dll') c_szDllName:Pchar; // <- функцию какой DLL хучить c_szApiName:PChar; // <- какую функцию хучить pApiNew:Pointer; // <- указатель на перехватчик p_pApiOrg:PPointer; // <- указатель на процедурный тип - тут вернут указатель на оригинальную функцию pApiToChange:Pointer) // <- можно ставить nil :Boolean; //<- True - OK, False - Fail Обратите внимание, тут не указывается идентификатор процесса, т.е. функция работает в текущем процессе.
http://www.transl-gunsmoker.ru/2009/08/blog-post_04.html
http://wm-help.net/books-online/book/59464/59464-16.html#h22. |