Т. е. нужен нативный аналог этого:
- Код: Выделить всё
System::Reflection::Assembly::GetExecutingAssembly()->Location
System::Reflection::Assembly::GetExecutingAssembly()->Location
Qwertiy писал(а):Именно имя файла, не assembly name.
Хакер писал(а):Получить имя файла легко — GetModuleName.
Qwertiy писал(а):А где хендл модуля взять?
Хакер писал(а):DLL-шке при загрузке передаётся её hModule и DLL-шка должна сохранить у себя это значение, если ей оно в дальнейшем потребуется.
Хакер писал(а):Имя какой из них нужно получить?
Qwertiy писал(а):Я думал, что выполняющийся код "знает", из какой он взят...
Хакер писал(а):То есть ты считал это врожденным свойством x86-машинного кода?
Хакер писал(а):А что именно она должна делать?
Qwertiy писал(а):Определять хендл dll'ки, в которой находится та функция, из которой она вызвана
Хакер писал(а):Та = функция, а она = кто?
Qwertiy писал(а):Ты издеваешься что ли
Qwertiy писал(а):Я же даже пример показал того, о чём думал. Только хендл вместо сборки.
Хакер писал(а):какая связь между этой функцией и этим модулем присутствует
Хакер писал(а):а она = кто?
VBTerminator писал(а):Как я понял, когда выполнение передаётся в какую-то функцию его библиотеки, этой функции надо узнать имя файла, в котором она была объявлена.
Qwertiy писал(а):Между вызывающей функцией и модулем - она в нём находится.
Qwertiy писал(а):Возможное решение - использование адреса возврата из стека.
Хакер писал(а):Вот видишь, теперь уже всё стало ясно (не на уровне догадок, а на уровне изложенного факта).
Хакер писал(а):То она во-первых насколько я помню есть.
Хакер писал(а):Для ситуации, когда код есть, а модуля нет, система должна быть спроектирована так, что в такой ситуации и получить имя/хендл модуля нельзя. Система спроектированна так.
Qwertiy писал(а):А что из этого было не ясно раньше?
Qwertiy писал(а):Присваивание выполнено не будет, поэтому в переменной будет лежать 0. Что тут хорошего?
Хакер писал(а):Какой-то совершенно не состоятельный довод. Про любую программу можно сказать: а что если какого-то присваивания в ней вдруг не состоится. Ой-ой, тогда всё пойдёт не так, как должно.
Хакер писал(а):сли какой-то код хочет получить имя модуля, значит он должен знать хендл модуля. И хендл модуля он должен получить от системы тогда, когда она загружает модуль. В противном случае, может быть код вообще живёт НЕ в модуле. Для ситуации, когда код есть, а модуля нет, система должна быть спроектирована так, что в такой ситуации и получить имя/хендл модуля нельзя. Система спроектированна так. Блестящее решение.
Qwertiy писал(а):Если код не в модуле, то DllMain не вызывается, хендл модуля не присваивается и остаётся 0. Или я неправильно представляю эту ситуацию?
Хакер писал(а):Если код не в модуле, то DllMain не существует, хендл не передаётся, присваивания нет, и самой переменной нет. Как и бесконечного множества других гипотетических сущностей, которых в мире не существует. В чём смысл о них думать, коли они не существуют?
Qwertiy писал(а):возможна: сторонняя программа загружает образ dll'ки в память, сам файл на диске не существует
Qwertiy писал(а):Если нет, то я не понимаю, как тот факт, что модуль может не существовать, связан со всем остальным в этой теме.
Хакер писал(а):Qwertiy писал(а):возможна: сторонняя программа загружает образ dll'ки в память, сам файл на диске не существует
Такая ситуация невозможна. Нельзя спроецировать в файл образ, которого нет на диске.
Хакер писал(а):Я тоже не понимаю. Ты спросил, почему они сделали так, а не иначе. Я ответил: то, как они сделали — пример хорошей инженерии, а то, как ты предлагаешь — пример плохой.
Qwertiy писал(а):В смысле в память?
Qwertiy писал(а):Если код не в модуле, то DllMain не существует, хендл не передаётся
VBTerminator писал(а):функции, ожидающие на входе хендл DLL?
Хакер писал(а):функции, ожидающие хендл DLL
Вернуться в Windows-программирование
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3