Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
Среда - C++Builder 6.0 (BCB) Есть BPL (например MyBpl), инсталлирована в BCB. В BPL есть форма TForm (например TForm::MyForm) Есть несколько DLL (например MyDll1, MyDll2), которые в своем функционале создают экземпляры MyForm. Проблема в том, что каждый экземпляр MyForm должен найти имя DLL из которой создан. Если в форме выполнить GetModuleFileName(handle ... и если handle из BPL, то возвращает имя MyBpl, а если handle=NULL, то возвращает имя exe-шника, откуда это все запускается. Как из DllEntryPoint DLL-ки передать в DllEntryPoint BPL-ки handle DLL-ки для GetModuleFileName(DllHandle ...? Может существуют другие способы раскопать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2017, 14:05 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
DLL это просто кусок программы. "Создает" же всё - исполняющий процесс/поток, которому пофиг, откуда взят код - он этого не знает. BPL это тоже, кстати, DLL. Так что ты хочешь странного. Корректно опиши, зачем ты это делаешь, чтобы правильно решить исходную задачу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2017, 15:10 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
PupkinКак из DllEntryPoint DLL-ки передать в DllEntryPoint BPL-ки handle DLL-ки для GetModuleFileName(DllHandle ...? Создать для этого специальную функцию и вызвать её после загрузки BPL - не предлагать? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2017, 15:11 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
Pupkin, Как вариант - добавить этому классу функцию в которой он вернет свой FileName. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2017, 15:16 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
SiemargТак что ты хочешь странного. Корректно опиши, зачем ты это делаешь, чтобы правильно решить исходную задачу.Я хочу не странного, а пива! И делаю я это только для зарплаты. А Вы, если не можете предложить правильно, предложите не правильно. Я подумаю... Dimitry SibiryakovСоздать для этого специальную функцию и вызвать её после загрузки BPL - не предлагать?Очень даже предлагать! Хотелось бы, чтобы существовало событие OnBPLLoaded для внешних DLL ну ядобавить этому классу функцию в которой он вернет свой FileName.Какому классу? Ответьте понятнее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2017, 16:14 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
PupkinSiemargТак что ты хочешь странного. Корректно опиши, зачем ты это делаешь, чтобы правильно решить исходную задачу.Я хочу не странного, а пива! И делаю я это только для зарплаты. А Вы, если не можете предложить правильно, предложите не правильно. Я подумаю... Dimitry SibiryakovСоздать для этого специальную функцию и вызвать её после загрузки BPL - не предлагать?Очень даже предлагать! Хотелось бы, чтобы существовало событие OnBPLLoaded для внешних DLL ну ядобавить этому классу функцию в которой он вернет свой FileName.Какому классу? Ответьте понятнее Q: В BPL есть форма TForm (например TForm::MyForm)... A: Вот этому самому классу, который TForm::MyForm. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2017, 16:52 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
PupkinКак из DllEntryPoint DLL-ки передать в DllEntryPoint BPL-ки handle DLL-ки для GetModuleFileName(DllHandle ...? Вообще, в DllEntryPoint HANDL загружаемой .dll передаёются в параметрах. Но ты хочешь получить ИМЯ этой динамической библиотеки. Именно той, которую ты пишешь. Ты не знаешь, какую библиотеку ты пишешь, и как она называется ? Очень странно... Если тебе нужно полное имя библиотеки, а ты знаешь только короткое (filename ты знаешь, а нужен full path )можно сделать следующий дежурный трюк: -- загрузить библиотеку по короткому имени (ты его должен всегда знать) -- если библиотека удачно загрузилась, сохранить её HANDLE как результат LoadLibrary, и выгрузить библиотеку (она реально НЕ выгрузится). Далее ты сможешь с этим handle .dll делать уже всё , что угодно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2017, 17:02 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
MasterZivНо ты хочешь получить ИМЯ этой динамической библиотеки. Именно той, которую ты пишешь. Ты не знаешь, какую библиотеку ты пишешь, и как она называется ? Очень странно... GetModuleFileName по хэндлу вернёт полный путь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2017, 21:13 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
ИзопропилMasterZivНо ты хочешь получить ИМЯ этой динамической библиотеки. Именно той, которую ты пишешь. Ты не знаешь, какую библиотеку ты пишешь, и как она называется ? Очень странно... GetModuleFileName по хэндлу вернёт полный путь Ну, я ж об этом и написал... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 14:52 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
Изопропил, MasterZiv... Ты не знаешь, какую библиотеку ты пишешь, и как она называется ? ... Если тебе нужно ... ... GetModuleFileName по хэндлу вернёт полный путь ... Ну, я ж об этом и написал...Вы, ребята, не пишите якобы ответы на выдуманные Вами вопросы. Мне нужно то, о чем я пишу в первом посте. Прочитайте ..ательно с первой строки по последнюю (а не часть оных), осознайте и ответьте, если есть чем. ---- Мне нужно предложить решение (или путь к оному) как узнать имя DLL (которых не одна) из формы, которая "живет" в BPL, и создается в DLL методом new. Тот же вопрос (только наоборот): как из DLL передать ее известный Instance в неявно вызываемую BPL в которой "живет" форма. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 10:30 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
Pupkin, чот я не очень понимаю, чего в итоге ты хочешь добиться... При загрузке dll в адресное пространство процесса вызывается функция DllMain, в которой ты можешь через psapi получить по этой dll всю необходимую информацию и сохранить её в статической области. Соответственно, все функции библиотеки могут дергать эту информацию. В чем проблема? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 12:02 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
Тоже не совсем понял, что куда передать надо. Если дело обстоит в загруженных в память dll-ках, то навигацию можно делать по таблицам импорта-экспорта API. Это есть у Рихтера в книжках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 12:14 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
PupkinМне нужно предложить решение (или путь к оному) как узнать имя DLL (которых не одна) из формы, которая "живет" в BPL, и создается в DLL методом new.добавить в конструктор формы дополнительный параметр запрещает какая то особая религия? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 12:52 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
ну и по адресу функции можно при желании найти DLL, сегментам кода которого этот адрес принадлежит PS что-то в консерватории не то, раз такие потребности возникают ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 12:55 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
Все ответы ясны. Не ясен исходный вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 14:29 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
На все ответы у нас нет вопросов (с) Председатель ТПРУНЯ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 15:17 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
PupkinМожет существуют другие способы раскопатьВсё гораздо проще: 1. В реализации BPL, в класс MyForm, добавь protected virtual метод с типом возврата char* и с return NULL в качестве реализации метода. Сам указатель на имя модуля можно хранить в статической области DLL; 2. В исходниках каждой DLL опиши класс-наследник от MyForm с переопределением этого виртуального метода, в реализации которого будешь дергать GetModuleFileName, если статический указатель на имя модуля еще не проинициализирован и возвращать имя модуля DLL; 3. В экспортируемой из DLL функции, которая занималась созданием экземпляра MyForm, создавай не экземпляр последнего, а экземпляр наследника от MyForm, указатель на который и будешь возвращать из экспортируемой функции с преобразованием типа указателя к MyForm*; Когда какой-либо метод из MyForm дёрнет переопределенный наследником виртуальный метод через таблицу виртуальных методов объекта, то получит корректное имя модуля DLL. Всё! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 15:27 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
rdb_devВсё гораздо прощечеловеку надо сохранить имя dll, из которой создана форма. Достаточно завести в классе формы поле и добавить в конструктор формы параметр. Но можно и заставить компьютер поработать, да )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 17:23 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
egorychrdb_devВсё гораздо прощечеловеку надо сохранить имя dll, из которой создана форма. Достаточно завести в классе формы поле и добавить в конструктор формы параметр. Но можно и заставить компьютер поработать, да )) Да, Это так. Я между прочим не спал всю ночь, читал топик, думал... Думал, как же помочь человеку.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2017, 06:10 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
egorych...Достаточно завести в классе формы поле и добавить в конструктор формы параметр...Да, конечно, это самый простой и наиболее приемлемый способ. Все элементарно. DLL знает свой handle и передает его в форму через параметр конструктора. Это замечательное решение меня не устраивает. Форма, о которой речь, есть такая, от которой наследуется очень много форм. Добавлять параметр в наследуемые неприемлемо (из-за количества наследников) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2017, 15:22 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
egorych А идея хорошая. Сейчас попробую передать handle через public member формы DLL:: *f=new... f->PulicMember=handle ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2017, 15:28 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
Pupkin Это замечательное решение меня не устраивает. Форма, о которой речь, есть такая, от которой наследуется очень много форм. Добавлять параметр в наследуемые неприемлемо (из-за количества наследников) Сделай не ещё один параметр конструктора, а приватное поле и setter (метод установки). Тогда паттерн использования такой: -- создал форму -- ... -- установил ранее созданной форме хэндл модуля. -- профит (поскольку шаг установки может быть пропущен, то хэндл модуля будет не обязательным полем, это надо предусмотреть) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2017, 15:32 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
Это я критикую собственное намерениеА идея хорошая. Сейчас попробую передать handle через public member формы DLL:: *f=new... f->PulicMember=handle Заело меня сегодня... Дело в том, что из DLL я создаю не MyForm, а наследника с требуемым функционалом. А конструктор наследника вызывает конструктор формы от которой наследуется... и т.д. Решение не устраивает из-за немерянного числа наследников ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2017, 16:54 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
PupkinДело в том, что из DLL я создаю не MyForm, а наследника с требуемым функционалом. А конструктор наследника вызывает конструктор формы от которой наследуется... и т.д. Решение не устраивает из-за немерянного числа наследников"Немеряного", это сколько? Тысяча, две?... Пара сотен DLL с десятками наследников MyForm? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2017, 09:01 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39461654&tid=2018162]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
162ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 267ms |

| 0 / 0 |
