Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
Это продолжение этой темы Как найти имя модуля Там не точно описана проблема и полемика ушла в бок и в треп. -------- Среда - C++Builder 6.0 (BCB) Есть BPL (например MyBpl), инсталлирована в BCB. В BPL есть базовая форма TForm (например TForm::TMyForm) и унаследованные от MyForm (например TMyForm::TMyFormChild,TMyFormChild:TMyFormGrandChild и т.д.) Есть несколько DLL (числом 26 штук (пока), например, MyDll1, MyDll2), которые в своем функционале создают экземпляры наследников TMyForm вызовом конструктора создаваемого экземпляра. Число экземпляров наследников не подлежит подсчету, а порядок - единицы сотен в каждой DLL. Каждый создаваемый экземпляр должен знать handle DLL из которой создан для удовлетворения "хотелки" заказчика. Проблема в том, что передача handle из DLL-ки через параметр конструктора или в member только что созданного экземпляра неприемлемо и не обсуждаемо . DLL трогать нельзя. Конструктор должен "сам внутри себя раскопать" handle через API, экспортируемые функции ядра, через что угодно. "Раскапывание" может быть в форме (лучше базовой) или в BPL, где живут цепочка унаследованных форм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 11:27 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
Pupkin, смотрю, ты таки жаждишь "одеть штаны через голову"... :) Чтож... Тогда в конструкторе MyForm на стеке резервируй блок памяти через alloca, по полученному указателю ищи вверх по стеку точку возврата и через PSAPI определяй какому модулю DLL этот адрес принадлежит. Вместо alloca можно попробовать объявить внутри конструктора на стеке volatile void* = NULL и получить на него указатель через оператор &. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 13:07 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
Pupkin, и не забудь директиву выравнивания, если будешь определять внутри конструктора volatile void* ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 13:24 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
GetHandle по имени возвращает HANDLE на DLL-ку, если она загружена. Иначе nullptr. При этом не надо делать потом FreeLibrary! Предыдущую ветку не читал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 13:38 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
CEMb, у него GetHandle вернет handle на BPL, а не на DLL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 14:15 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
rdb_devPupkin, смотрю, ты таки жаждишь "одеть штаны через голову"... :) Чтож... Жаждю !!! А нельзя ли поподробней. Не про штаны, а про второе... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 14:59 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
Pupkinrdb_devPupkin, смотрю, ты таки жаждишь "одеть штаны через голову"... :) Чтож... Жаждю !!! А нельзя ли поподробней. Не про штаны, а про второе... Да фигня это всё, тщетные попытки спеть басом... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 15:14 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
PupkinЕсть несколько DLL (числом 26 штук (пока), например, MyDll1, MyDll2), которые в своем функционале создают экземпляры наследников TMyForm вызовом конструктора создаваемого экземпляра. Число экземпляров наследников не подлежит подсчету, а порядок - единицы сотен в каждой DLL. Каждый создаваемый экземпляр должен знать handle DLL из которой создан для удовлетворения "хотелки" заказчика. Проблема в том, что передача handle из DLL-ки через параметр конструктора или в member только что созданного экземпляра неприемлемо и не обсуждаемо . DLL трогать нельзя.А в чем проблема то? Так заказчику и говоришь: объем работы очень большой, делать не возьмусь ну за какие деньги. Ну или как вариант: это будет стоить вам $100000. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 15:20 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
rdb_devCEMb, у него GetHandle вернет handle на BPL, а не на DLL. Нет, всё верно он написал. Эта функция вернёт хэндл указанного модуля, если он загружен конечно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 16:02 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)rdb_devCEMb, у него GetHandle вернет handle на BPL, а не на DLL. Нет, всё верно он написал. Эта функция вернёт хэндл указанного модуля, если он загружен конечно Как я понял ТСу надо узнать то самое lpModuleName. Т.е. он хочешь узнать хэндл, а по нему определить lpModuleName. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 16:27 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)rdb_devCEMb, у него GetHandle вернет handle на BPL, а не на DLL. Нет, всё верно он написал. Эта функция вернёт хэндл указанного модуля, если он загружен конечноВозвращаемся к первой серии: а как найти имя? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 16:28 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
Barlonekealon(Ruslan)пропущено... Нет, всё верно он написал. Эта функция вернёт хэндл указанного модуля, если он загружен конечноВозвращаемся к первой серии: а как найти имя? ну скажем так, у него довольно странная модель плагинов в вакууме при такой постановке здачи, в общем виде это сделать нельзя, наследуемая форма вообще может не иметь ни одного вызова кода из DLL тут ванговать бесполезно, нужно знать как создаётся форма, как регистрируется плагин и пр. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 16:50 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
хотя нет, туплю уже в середине недели можно, адресс VMT текущего класса находится в константной секции DLL дальше искать dll содержащую этот адрес с помощью TlHelp32 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 16:55 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
Простите, что вверг вас в рекурсию. +1 за TlHelp32 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2017, 05:06 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)хотя нет, туплю уже в середине недели можно, адресс VMT текущего класса находится в константной секции DLL дальше искать dll содержащую этот адрес с помощью TlHelp32 если класс не переопределяет виртуальных методов - оптимизатор часом не воспользуется родительской VMT(если RTTI отключён)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2017, 08:21 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
BarlonePupkinЕсть несколько DLL (числом 26 штук (пока), например, MyDll1, MyDll2), которые в своем функционале создают экземпляры наследников TMyForm вызовом конструктора создаваемого экземпляра. Число экземпляров наследников не подлежит подсчету, а порядок - единицы сотен в каждой DLL. Каждый создаваемый экземпляр должен знать handle DLL из которой создан для удовлетворения "хотелки" заказчика. Проблема в том, что передача handle из DLL-ки через параметр конструктора или в member только что созданного экземпляра неприемлемо и не обсуждаемо . DLL трогать нельзя.А в чем проблема то? Так заказчику и говоришь: объем работы очень большой, делать не возьмусь ну за какие деньги. Ну или как вариант: это будет стоить вам $100000.Не обсуждаемо !!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2017, 08:38 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
Изопропилkealon(Ruslan)хотя нет, туплю уже в середине недели можно, адресс VMT текущего класса находится в константной секции DLL дальше искать dll содержащую этот адрес с помощью TlHelp32 если класс не переопределяет виртуальных методов - оптимизатор часом не воспользуется родительской VMT(если RTTI отключён)? VMT-блок так же содержит имя класса, ссылку на родительский блок, так что для каждого класса взятого линкёром она обязательно есть. Информаци о полях тут не важна Код: pascal 1. вовращаемый ей адресс и нужно искать в диапазонах загрузки билиотек ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2017, 08:42 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
PupkinНе обсуждаемо !!!Если я всё правильно понял, то: если код DLL-ки создал форму, будучи вызванным в, например, основном потоке, то она (форма) ничем топологически отличаться не будет от формы, созданной самим приложением. Если же это другой поток, например хук с внедрением, то можно по адресу расположения данных понять, какому потоку/DLL-ке принадлежит объект. А, даже есть уже готовая функция: GetWindowThreadProcessId, которая по хендлу окна скажет, в каком потоке оно создано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2017, 08:48 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)вовращаемый ей адресс и нужно искать в диапазонах загрузки билиотекя сначала тоже хотел это написать, но потом засомневался: диапазон загрузки библиотеки относится вроде только к исполняемому коду? Данные по созданной форме будут лежать где-то на стеке, и понять по ним/адресу ничего не получится. Но вот я не знаю, где лежать статические данные динамически загружаемых библиотек? Это так, просто интересно... проблему автора это не решает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2017, 08:51 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
Кривой костыль, но как вариант: HMODULE это адрес проецирования содержимого DLL в адресное пространство процесса. Поэтому берем адрес какого-нибудь виртуального метода, о котором заведомо известно что он прописан внутри DLL и перебором ищем наибольший HMODULE меньше этого адреса. Может кроме виртуальных методов можно еще что-то использовать, главное чтобы это что-то располагалось в коде искомой DLL и было связано с нужным объектом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2017, 09:13 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
CEMbА, даже есть уже готовая функция: GetWindowThreadProcessId, которая по хендлу окна скажет, в каком потоке оно создано. а поток то здесь при чём? срочно выдохни ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2017, 09:20 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
PupkinА нельзя ли поподробней. Не про штаны, а про второе...Можно! Некоторые, конечно, могут назвать это грязным хаком, но делается это, примерно, так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. MSDN::Traversing the Module List Модератор: rdb_dev, Проверь, правильно ли я исправил код ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2017, 10:27 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
CEMbkealon(Ruslan)вовращаемый ей адресс и нужно искать в диапазонах загрузки билиотекя сначала тоже хотел это написать, но потом засомневался: диапазон загрузки библиотеки относится вроде только к исполняемому коду? Данные по созданной форме будут лежать где-то на стеке, и понять по ним/адресу ничего не получится. Но вот я не знаю, где лежать статические данные динамически загружаемых библиотек? Это так, просто интересно... проблему автора это не решает. нет, куда ещё по твоему константы должны идти? CEMbPupkinНе обсуждаемо !!!Если я всё правильно понял, то: если код DLL-ки создал форму, будучи вызванным в, например, основном потоке, то она (форма) ничем топологически отличаться не будет от формы, созданной самим приложением. Если же это другой поток, например хук с внедрением, то можно по адресу расположения данных понять, какому потоку/DLL-ке принадлежит объект. А, даже есть уже готовая функция: GetWindowThreadProcessId, которая по хендлу окна скажет, в каком потоке оно создано. смотри, вот тебе готовое решение Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. вывод: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2017, 12:12 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
rdb_devPupkinА нельзя ли поподробней. Не про штаны, а про второе...Можно! Некоторые, конечно, могут назвать это грязным хаком, но делается это, примерно, так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. MSDN::Traversing the Module List Модератор: rdb_dev, Проверь, правильно ли я исправил код А потом при сборке в релиз отключается stack frames, и всё падает... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2017, 19:58 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
Dima TКривой костыль, но как вариант: HMODULE это адрес проецирования содержимого DLL в адресное пространство процесса. Поэтому берем адрес какого-нибудь виртуального метода, о котором заведомо известно что он прописан внутри DLL и перебором ищем наибольший HMODULE меньше этого адреса. Может кроме виртуальных методов можно еще что-то использовать, главное чтобы это что-то располагалось в коде искомой DLL и было связано с нужным объектом.А вы уверены, что модуль, в котором описан класс, и модуль, в котором вызывается конструктор - один и тот же? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2017, 20:01 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39463051&tid=2018155]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
156ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 264ms |

| 0 / 0 |
