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


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