Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
BarloneDima TКривой костыль, но как вариант: HMODULE это адрес проецирования содержимого DLL в адресное пространство процесса. Поэтому берем адрес какого-нибудь виртуального метода, о котором заведомо известно что он прописан внутри DLL и перебором ищем наибольший HMODULE меньше этого адреса. Может кроме виртуальных методов можно еще что-то использовать, главное чтобы это что-то располагалось в коде искомой DLL и было связано с нужным объектом.А вы уверены, что модуль, в котором описан класс, и модуль, в котором вызывается конструктор - один и тот же? Тут главное быть уверенным что есть что-то связанное с нужным классом, что гарантированно располагается внутри DLL и есть возможность получить адрес в памяти этого что-то. kealon(Ruslan) эту тему развил 20530770 и вроде как даже работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2017, 20:08 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
rdb_devНекоторые, конечно, могут назвать это грязным хаком, но делается это, примерно, так: А, и еще... Если написать это в конструкторе базового класса, в адресе возврата будет будет конструктор ближайшего потомка... А это ли надо автору? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2017, 20:12 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
По крайней мере, вот из этого PupkinЕсть BPL (например MyBpl), инсталлирована в BCB. В BPL есть базовая форма TForm (например TForm::TMyForm) и унаследованные от MyForm (например TMyForm::TMyFormChild,TMyFormChild:TMyFormGrandChild и т.д.) создается впечатление, что все наследники описаны в одном .bpl, а узнать хочется хендл модуля, где вызов new ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2017, 20:16 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
Изопропила поток то здесь при чём? срочно выдохнине буду. Поток тут при том, что, по моему мнению, это единственный случай, когда можно определить, какой либой создан объект, без использования дополнительных приседаний. kealon(Ruslan)CEMbя сначала тоже хотел это написать, но потом засомневался: диапазон загрузки библиотеки относится вроде только к исполняемому коду?нет, куда ещё по твоему константы должны идти?Константы проблему автора вроде не решают, для решения нужна динамическая память kealon(Ruslan)смотри, вот тебе готовое решениеа нет, решает, но почему ClassInfo в данном случае - константа? И... и у меня ещё подозрение, что если форму этого класса создать в коде другой библиотеки, то адрес ClassInfo останется прежним? Если нет, то почему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 05:30 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
CEMbkealon(Ruslan)смотри, вот тебе готовое решениеа нет, решает, но почему ClassInfo в данном случае - константа? И... и у меня ещё подозрение, что если форму этого класса создать в коде другой библиотеки, то адрес ClassInfo останется прежним? Если нет, то почему? ClassInfo это арес VMT-блока в той либе где объявлен класс, автору надо бы точнее формулировать PupkinКаждый создаваемый экземпляр должен знать handle DLL из которой создан для удовлетворения "хотелки" заказчика. это можно понять двояко ждёмс автора ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 08:46 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
BarloneА вы уверены, что модуль, в котором описан класс, и модуль, в котором вызывается конструктор - один и тот же?Для "Borland C++ Builder 6" уверен. Отключение дополнительных инструкций формирования кадра стека для обеспечения отладки никак не влияет на основную часть соглашение вызова fastcall. Указатель на предшествующую перед вызовом вершину стека и адрес возврата всё равно будут сохранены в стеке. Поведение легко проверить - достаточно создать по шаблону маленький проект с одной формой, добавить в конструктор указанный фрагмент кода, переключить компиляцию проекта из Debug в Release, убедиться, что отключен StackFrames, собрать проект и декомпилировать в ассемблер. Для такой простой затеи вполне подойдет дизассембер, имеющийся в удобном инструменте просмотра PE заголовков CFF Explorer . Правда, есть один нюанс - fastcall не стандартизирован и его поведение может меняться. Если кого-то не устраивает эта ситуация, можно использовать stdcall. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 09:30 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
BarloneА, и еще... Если написать это в конструкторе базового класса, в адресе возврата будет будет конструктор ближайшего потомка... А это ли надо автору?Похоже, что именно это ему и надо - точка возврата в конструктор потомка, реализованного в DLL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 09:34 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
Ставки на топикстартера будем делать (получится у него или нет)? Можно там по 1000 рублей, или на пиво... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 10:45 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
MasterZiv, проверь почту - письмо с темой о пиве. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 11:08 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
rdb_devBarloneА, и еще... Если написать это в конструкторе базового класса, в адресе возврата будет будет конструктор ближайшего потомка... А это ли надо автору?Похоже, что именно это ему и надо - точка возврата в конструктор потомка, реализованного в DLL.Ну не знаю, я перечитываю первое сообщение в этой теме, и в предыдущей теме - и мне кажется, что у него все формы объявлены в одном .bpl, а создаются в разных .dll ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 12:02 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
Так что адрес vmt - не вариант, он не в том модуле будет. И ближайший кадр стека - тоже мимо. Надо раскручивать стек до адреса в .dll ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 12:05 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
BarloneНу не знаю, я перечитываю первое сообщение в этой теме, и в предыдущей теме - и мне кажется, что у него все формы объявлены в одном .bpl, а создаются в разных .dllНа сколько я понял, BPL он менять может, а DLL нет. Поэтому, зарядить фрагмент кода во всех наследников, реализованных в BPL, ему не составит большого труда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 12:09 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
Не, уже проходили... "Решение не устраивает из-за немеряного числа наследников" 20520800 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 12:12 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
BarloneТак что адрес vmt - не вариант, он не в том модуле будет. И ближайший кадр стека - тоже мимо. Надо раскручивать стек до адреса в .dllНе вижу большой проблемы... Какой-нибудь из конструкторов да получит адрес возврата в DLL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 12:16 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
Barlone, он ранее писал, что в BPL у него только MyForm, а всё остальное в DLL, которые он первое - не может менять, второе - наследников в DLL, типа, очень много. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 12:18 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
Перечитал, действительно непонятно что ищем: имя DLL где прописана форма-наследник или DLL из которой был вызов new для создания формы. Я подумал про первое. ИМХО Во-втором случае только стэк разматывать в конструкторе TMyForm. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 12:35 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
Dima TПеречитал, действительно непонятно что ищем: имя DLL где прописана форма-наследник или DLL из которой был вызов new для создания формы. Я подумал про первое. ИМХО Во-втором случае только стэк разматывать в конструкторе TMyForm. я тоже думал что первое, для второго случае можно проще ну его конструктор разматывать в TObject есть две виртуальные функции, которые всегда вызываются class function NewInstance: TObject; virtual; - до вызова конструктора, собственно она и выделяет память procedure AfterConstruction; virtual; - после вызова конструктора вторая хуже, её часто переопределяют, а вот первая, вполне - там стэк небольшой будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 13:08 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
rdb_devBarlone, он ранее писал, что в BPL у него только MyForm, а всё остальное в DLL, которые он первое - не может менять, второе - наследников в DLL, типа, очень много.Где он такое писал? Я вижу: "Есть BPL (например MyBpl), инсталлирована в BCB. В BPL есть форма TForm (например TForm::MyForm)" 20492969 "Мне нужно предложить решение (или путь к оному) как узнать имя DLL (которых не одна) из формы, которая "живет" в BPL, и создается в DLL методом new." 20510445 "В BPL есть базовая форма TForm (например TForm::TMyForm) и унаследованные от MyForm (например TMyForm::TMyFormChild,TMyFormChild:TMyFormGrandChild и т.д.)" 20526556 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 18:09 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
CEMbИзопропила поток то здесь при чём? срочно выдохнине буду. Поток тут при том, что, по моему мнению, это единственный случай, когда можно определить, какой либой создан объект, без использования дополнительных приседаний. ещё раз - какое отношение к задаче топикстартера имеют потоки? вроде как поток в состоянии исполнить код из любой загруженной DLL и из кучи(если для страниц установлен бит разрешения исполнения). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 18:44 |
|
||
|
Как найти handle модуля
|
|||
|---|---|---|---|
|
#18+
Изопропилещё раз - какое отношение к задаче топикстартера имеют потоки?предположил, что объект, созданный в потоке, будет лежать в области памяти потока. Но: вроде как поток в состоянии исполнить код из любой загруженной DLLкак и любая DLL может вызвать код из любого места. Поэтому вообще ничего определённо сказать по самому объекту нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2017, 05:13 |
|
||
|
|

start [/forum/topic.php?fid=57&gotonew=1&tid=2018155]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
159ms |
get topic data: |
11ms |
get first new msg: |
8ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 287ms |

| 0 / 0 |
