Этот баннер — требование Роскомнадзора для исполнения 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 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
rdb_dev"Немеряного", это сколько? Тысяча, две?... Пара сотен DLL с десятками наследников MyForm?Усмехнулся (про себя) Dll-ок всего 26 (посчитал в групповом проекте), формы считать не буду. Очень много. Единицы сотен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2017, 12:05 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
Pupkinrdb_dev"Немеряного", это сколько? Тысяча, две?... Пара сотен DLL с десятками наследников MyForm?Усмехнулся (про себя) Dll-ок всего 26 (посчитал в групповом проекте), формы считать не буду. Очень много. Единицы сотен. Проблема-то в чём ? Ты в базовом классе добавляешь поле (member) и фукнцию его установки. Оно появляется во всех наследниках автоматом. Нужно будет только установить в нужном месте это поле с помощью функции установки (сеттера), до реального использования формы, где это поле может понадобиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2017, 12:30 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
MasterZiv Проблема-то в чём ? Ты в базовом классе добавляешь поле (member) и фукнцию его установки. Оно появляется во всех наследниках автоматом. Нужно будет только установить в нужном месте это поле с помощью функции установки (сеттера), до реального использования формы, где это поле может понадобиться.Ты в базовом классе добавляешь поле... Добавлю ! Оно появляется во всех наследниках автоматом... Появится ! Нужно будет только установить это поле с помощью (сеттера)... А откуда setter возмет устанавливаемое значение ? Из конструктора (иначе откуда?) , каковых столько, сколько форм, в том числе унаследованных ? Наличие settera и membera не снимает факта передачи handle в форму ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2017, 13:41 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
PupkinА откуда setter возмет устанавливаемое значение ?следующей строкой после new придётся дописать вызов сеттера, деваться некуда. PS За то время, которое потрачено на поиск более изящного решения уже можно было запрограммировать решение в лоб )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2017, 14:54 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
egorychPupkinА откуда setter возмет устанавливаемое значение ?следующей строкой после new придётся дописать вызов сеттера, деваться некуда. PS За то время, которое потрачено на поиск более изящного решения уже можно было запрограммировать решение в лоб )) Я как-то уже сомневаюсь в адекватности вопрощающего... Может, он там под воздействием вредных веществ или в состоянии раздвоения сознания? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2017, 15:19 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
PupkinТы в базовом классе добавляешь поле... Добавлю ! Оно появляется во всех наследниках автоматом... Появится ! Нужно будет только установить это поле с помощью (сеттера)... А откуда setter возмет устанавливаемое значение ? PupkinПроблема в том, что каждый экземпляр MyForm должен найти имя DLL из которой создан. DLL, создающая экземпляр MyForm, знает свой хендл DLL-и? Знает. Может передать в MyForm ? Может. PupkinИз конструктора (иначе откуда?) , каковых столько, сколько форм, в том числе унаследованных ? Наличие settera и membera не снимает факта передачи handle в форму Ты не хочешь добавлять ещё один параметр в конструктор. ОК, валидное желание. Сразу после создания экземпляра MyForm можно ему задать хендл только что создавшей его .DLL-и ? Можно. Так и сделай это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2017, 15:24 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
MasterZivDLL, создающая экземпляр MyForm, знает свой хендл DLL-и? Знает. Может передать в MyForm ? Может. . Может, но неприемлемо по объему переписываемого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 08:28 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
Pupkin Может, но неприемлемо по объему переписываемого. а руками переписывать и не обязательно. процесс можно автоматизировать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 08:48 |
|
||
|
Как найти имя модуля
|
|||
|---|---|---|---|
|
#18+
Изопропила руками переписывать и не обязательно. процесс можно автоматизироватьМожно, конечно. Слышал, можно даже штаны через голову одевать. Уважаемые Господакак-то все пошло не туда...Продолжение темы с уточненной проблемой здесь Как найти handle модуля ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 11:38 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2018162]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
247ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
| others: | 11ms |
| total: | 365ms |

| 0 / 0 |
