powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как найти имя модуля
34 сообщений из 34, показаны все 2 страниц
Как найти имя модуля
    #39455404
Pupkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Среда - 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 ...?

Может существуют другие способы раскопать
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39455460
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DLL это просто кусок программы. "Создает" же всё - исполняющий процесс/поток, которому пофиг, откуда взят код - он этого не знает.

BPL это тоже, кстати, DLL.

Так что ты хочешь странного.
Корректно опиши, зачем ты это делаешь, чтобы правильно решить исходную задачу.
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39455461
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PupkinКак из DllEntryPoint DLL-ки передать в DllEntryPoint BPL-ки handle DLL-ки
для GetModuleFileName(DllHandle ...?

Создать для этого специальную функцию и вызвать её после загрузки BPL - не предлагать?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39455466
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pupkin,

Как вариант - добавить этому классу функцию в которой он вернет свой FileName.
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39455504
Pupkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SiemargТак что ты хочешь странного.
Корректно опиши, зачем ты это делаешь, чтобы правильно решить исходную задачу.Я хочу не странного, а пива! И делаю я это только для зарплаты.
А Вы, если не можете предложить правильно, предложите не правильно. Я подумаю...

Dimitry SibiryakovСоздать для этого специальную функцию и вызвать её после загрузки BPL - не предлагать?Очень даже предлагать!
Хотелось бы, чтобы существовало событие OnBPLLoaded для внешних DLL

ну ядобавить этому классу функцию в которой он вернет свой FileName.Какому классу? Ответьте понятнее
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39455540
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PupkinSiemargТак что ты хочешь странного.
Корректно опиши, зачем ты это делаешь, чтобы правильно решить исходную задачу.Я хочу не странного, а пива! И делаю я это только для зарплаты.
А Вы, если не можете предложить правильно, предложите не правильно. Я подумаю...

Dimitry SibiryakovСоздать для этого специальную функцию и вызвать её после загрузки BPL - не предлагать?Очень даже предлагать!
Хотелось бы, чтобы существовало событие OnBPLLoaded для внешних DLL

ну ядобавить этому классу функцию в которой он вернет свой FileName.Какому классу? Ответьте понятнее
Q: В BPL есть форма TForm (например TForm::MyForm)...
A: Вот этому самому классу, который TForm::MyForm.
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39455546
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PupkinКак из DllEntryPoint DLL-ки передать в DllEntryPoint BPL-ки handle DLL-ки
для GetModuleFileName(DllHandle ...?


Вообще, в DllEntryPoint HANDL загружаемой .dll передаёются в параметрах.

Но ты хочешь получить ИМЯ этой динамической библиотеки. Именно той, которую ты пишешь.
Ты не знаешь, какую библиотеку ты пишешь, и как она называется ?
Очень странно...

Если тебе нужно полное имя библиотеки, а ты знаешь только короткое (filename ты знаешь, а нужен full path )можно сделать
следующий дежурный трюк:
-- загрузить библиотеку по короткому имени (ты его должен всегда знать)
-- если библиотека удачно загрузилась, сохранить её HANDLE как результат LoadLibrary, и выгрузить библиотеку (она реально НЕ выгрузится).

Далее ты сможешь с этим handle .dll делать уже всё , что угодно.
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39455668
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНо ты хочешь получить ИМЯ этой динамической библиотеки. Именно той, которую ты пишешь.
Ты не знаешь, какую библиотеку ты пишешь, и как она называется ?
Очень странно...
GetModuleFileName по хэндлу вернёт полный путь
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39456190
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилMasterZivНо ты хочешь получить ИМЯ этой динамической библиотеки. Именно той, которую ты пишешь.
Ты не знаешь, какую библиотеку ты пишешь, и как она называется ?
Очень странно...
GetModuleFileName по хэндлу вернёт полный путь

Ну, я ж об этом и написал...
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39459390
Pupkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил, MasterZiv... Ты не знаешь, какую библиотеку ты пишешь, и как она называется ?
... Если тебе нужно ...
... GetModuleFileName по хэндлу вернёт полный путь
... Ну, я ж об этом и написал...Вы, ребята, не пишите якобы ответы
на выдуманные Вами вопросы.

Мне нужно то, о чем я пишу в первом посте. Прочитайте ..ательно с первой строки по
последнюю (а не часть оных), осознайте и ответьте, если есть чем.
----
Мне нужно предложить решение (или путь к оному) как узнать имя DLL (которых не одна)
из формы, которая "живет" в BPL, и создается в DLL методом new.

Тот же вопрос (только наоборот): как из DLL передать ее известный Instance в неявно
вызываемую BPL в которой "живет" форма.
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39459430
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39459494
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pupkin, чот я не очень понимаю, чего в итоге ты хочешь добиться... При загрузке dll в адресное пространство процесса вызывается функция DllMain, в которой ты можешь через psapi получить по этой dll всю необходимую информацию и сохранить её в статической области. Соответственно, все функции библиотеки могут дергать эту информацию. В чем проблема?
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39459516
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тоже не совсем понял, что куда передать надо.
Если дело обстоит в загруженных в память dll-ках, то навигацию можно делать по таблицам импорта-экспорта API. Это есть у Рихтера в книжках.
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39459569
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PupkinМне нужно предложить решение (или путь к оному) как узнать имя DLL (которых не одна)
из формы, которая "живет" в BPL, и создается в DLL методом new.добавить в конструктор формы дополнительный параметр запрещает какая то особая религия?
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39459571
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и по адресу функции можно при желании найти DLL, сегментам кода которого этот адрес принадлежит

PS что-то в консерватории не то, раз такие потребности возникают
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39459679
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все ответы ясны.
Не ясен исходный вопрос.
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39459747
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На все ответы у нас нет вопросов (с) Председатель ТПРУНЯ
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39459763
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PupkinМожет существуют другие способы раскопатьВсё гораздо проще:
1. В реализации BPL, в класс MyForm, добавь protected virtual метод с типом возврата char* и с return NULL в качестве реализации метода. Сам указатель на имя модуля можно хранить в статической области DLL;
2. В исходниках каждой DLL опиши класс-наследник от MyForm с переопределением этого виртуального метода, в реализации которого будешь дергать GetModuleFileName, если статический указатель на имя модуля еще не проинициализирован и возвращать имя модуля DLL;
3. В экспортируемой из DLL функции, которая занималась созданием экземпляра MyForm, создавай не экземпляр последнего, а экземпляр наследника от MyForm, указатель на который и будешь возвращать из экспортируемой функции с преобразованием типа указателя к MyForm*;

Когда какой-либо метод из MyForm дёрнет переопределенный наследником виртуальный метод через таблицу виртуальных методов объекта, то получит корректное имя модуля DLL. Всё!
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39459876
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devВсё гораздо прощечеловеку надо сохранить имя dll, из которой создана форма. Достаточно завести в классе формы поле и добавить в конструктор формы параметр. Но можно и заставить компьютер поработать, да ))
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39460075
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychrdb_devВсё гораздо прощечеловеку надо сохранить имя dll, из которой создана форма. Достаточно завести в классе формы поле и добавить в конструктор формы параметр. Но можно и заставить компьютер поработать, да ))


Да, Это так.


Я между прочим не спал всю ночь, читал топик, думал... Думал, как же помочь человеку....
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39461654
Pupkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
egorych...Достаточно завести в классе формы поле и добавить в конструктор формы
параметр...Да, конечно, это самый простой и наиболее приемлемый способ.
Все элементарно. DLL знает свой handle и передает его в форму через параметр конструктора.

Это замечательное решение меня не устраивает.

Форма, о которой речь, есть такая, от которой наследуется очень много форм. Добавлять
параметр в наследуемые неприемлемо (из-за количества наследников)
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39461661
Pupkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
egorych А идея хорошая.
Сейчас попробую передать handle через public member формы

DLL:: *f=new...
f->PulicMember=handle
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39461665
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pupkin
Это замечательное решение меня не устраивает.

Форма, о которой речь, есть такая, от которой наследуется очень много форм. Добавлять
параметр в наследуемые неприемлемо (из-за количества наследников)

Сделай не ещё один параметр конструктора, а приватное поле и setter (метод установки).
Тогда паттерн использования такой:
-- создал форму
-- ...
-- установил ранее созданной форме хэндл модуля.
-- профит

(поскольку шаг установки может быть пропущен, то хэндл модуля будет не обязательным полем, это надо предусмотреть)
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39461713
Pupkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это я критикую собственное намерениеА идея хорошая.
Сейчас попробую передать handle через public member формы

DLL:: *f=new...
f->PulicMember=handle Заело меня сегодня...

Дело в том, что из DLL я создаю не MyForm, а наследника с требуемым функционалом.
А конструктор наследника вызывает конструктор формы от которой наследуется... и т.д.

Решение не устраивает из-за немерянного числа наследников
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39461989
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PupkinДело в том, что из DLL я создаю не MyForm, а наследника с требуемым функционалом.
А конструктор наследника вызывает конструктор формы от которой наследуется... и т.д.

Решение не устраивает из-за немерянного числа наследников"Немеряного", это сколько? Тысяча, две?... Пара сотен DLL с десятками наследников MyForm?
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39462149
Pupkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_dev"Немеряного", это сколько? Тысяча, две?... Пара сотен DLL с десятками наследников MyForm?Усмехнулся (про себя)
Dll-ок всего 26 (посчитал в групповом проекте), формы считать не буду. Очень много. Единицы сотен.
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39462177
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pupkinrdb_dev"Немеряного", это сколько? Тысяча, две?... Пара сотен DLL с десятками наследников MyForm?Усмехнулся (про себя)
Dll-ок всего 26 (посчитал в групповом проекте), формы считать не буду. Очень много. Единицы сотен.

Проблема-то в чём ? Ты в базовом классе добавляешь поле (member) и фукнцию его установки.
Оно появляется во всех наследниках автоматом.
Нужно будет только установить в нужном месте это поле с помощью функции установки (сеттера), до реального использования
формы, где это поле может понадобиться.
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39462276
Pupkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv
Проблема-то в чём ? Ты в базовом классе добавляешь поле (member) и фукнцию его установки.
Оно появляется во всех наследниках автоматом.
Нужно будет только установить в нужном месте это поле с помощью функции установки (сеттера), до реального использования
формы, где это поле может понадобиться.Ты в базовом классе добавляешь поле... Добавлю !
Оно появляется во всех наследниках автоматом... Появится !
Нужно будет только установить это поле с помощью (сеттера)...
А откуда setter возмет устанавливаемое значение ?
Из конструктора (иначе откуда?) , каковых столько, сколько форм, в том числе унаследованных ?

Наличие settera и membera не снимает факта передачи handle в форму
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39462372
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PupkinА откуда setter возмет устанавливаемое значение ?следующей строкой после new придётся дописать вызов сеттера, деваться некуда.
PS За то время, которое потрачено на поиск более изящного решения уже можно было запрограммировать решение в лоб ))
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39462402
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychPupkinА откуда setter возмет устанавливаемое значение ?следующей строкой после new придётся дописать вызов сеттера, деваться некуда.
PS За то время, которое потрачено на поиск более изящного решения уже можно было запрограммировать решение в лоб ))

Я как-то уже сомневаюсь в адекватности вопрощающего...
Может, он там под воздействием вредных веществ или в состоянии раздвоения сознания?
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39462413
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PupkinТы в базовом классе добавляешь поле... Добавлю !
Оно появляется во всех наследниках автоматом... Появится !
Нужно будет только установить это поле с помощью (сеттера)...
А откуда setter возмет устанавливаемое значение ?


PupkinПроблема в том, что каждый экземпляр MyForm должен найти имя DLL из которой создан.


DLL, создающая экземпляр MyForm, знает свой хендл DLL-и? Знает.
Может передать в MyForm ? Может.

PupkinИз конструктора (иначе откуда?) , каковых столько, сколько форм, в том числе унаследованных ?
Наличие settera и membera не снимает факта передачи handle в форму

Ты не хочешь добавлять ещё один параметр в конструктор.
ОК, валидное желание.
Сразу после создания экземпляра MyForm можно ему задать хендл только что создавшей его .DLL-и ?
Можно. Так и сделай это.
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39462810
Pupkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivDLL, создающая экземпляр MyForm, знает свой хендл DLL-и? Знает.
Может передать в MyForm ? Может. . Может, но неприемлемо по объему переписываемого.
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39462821
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pupkin Может, но неприемлемо по объему переписываемого.
а руками переписывать и не обязательно. процесс можно автоматизировать
...
Рейтинг: 0 / 0
Как найти имя модуля
    #39462966
Pupkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропила руками переписывать и не обязательно. процесс можно автоматизироватьМожно, конечно.
Слышал, можно даже штаны через голову одевать.

Уважаемые Господакак-то все пошло не туда...Продолжение темы с уточненной проблемой здесь Как найти handle модуля
...
Рейтинг: 0 / 0
34 сообщений из 34, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как найти имя модуля
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]