![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| Max111 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 18.1.2006 Репутация: нет Всего: нет |
Доброе утро,
Преамбула: Долго ругались с заказчиком и выяснилось что, я использую в своей программе вызовы устаревших ф-ций из DLL заказчика. Вопрос: Я знаю что, при помощи ф-ции “GetProcAddress” можно получить адрес экспортируемой ф-ции из DLL и совершенно спокойно работать с ним. Но данная работа насколько я понимаю возможна только если знаешь имя экспортируемой ф-ции. В связи с длительными спорами с заказчиком (он спокойно изменяет имена ф-ций в новых версиях DLL(s)) Возникла следующая мысль: Можно ли получить в своей программе весь список экспоритируемых ф-ций, Из подключаемой DLL? С огромным вниманием выслушаю любые советы. Максим [email protected] |
|||
|
||||
| AndreyANM |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 4.1.2006 Репутация: нет Всего: нет |
Вот примеры процедур (Взяты из DelphiWorld)
Я сам их не проверял.
Пример использования: if not GetImageFunctionList('kernel32.dll', ListBox1.Items) then raise Exception.Create('Произошла ошибка');
Есть еще множество похожих функций.. |
||||||
|
|||||||
| Max111 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 18.1.2006 Репутация: нет Всего: нет |
Большое спасибо
Получение списка экспортируемых ф-ций произошло. Но остался один не выясненый вопрос: можно ли получить данный список с параметрами и типами этих ф-ций? |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: нет Всего: 173 |
Если коротко: нет. Такую информацию иногда вставляют в имя экспортируемой функции компиляторы C++, но это не ваш случай. Для таких целей COM прекрасно подходит, но DLL не ваша... -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Max111 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 18.1.2006 Репутация: нет Всего: нет |
Доброе утро,
Уважаемый Void, если можно поподробнее с этого. Правда Я даже не знаю как правильно задать вопрос: но проблемма в следующем. А на каком принципе основано импортирование библиотек в среде Дельфи. может быть мне пойти этим путем? |
|||
|
||||
| Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: 1 Всего: 10 |
Таким же способом, как и на других языках. Если библиотека подключена статически, то винда грузит ее во время загрузки программы. Если подключение динамическое, то программа грузит по мере надобности. Потом идет настройка линков на открытые функции. И запуск DllMain с параметром DLL_PROCESS_ATTACH.
В самой библиотеке не хранятся данные о параметрах функции. Хотя если функцию писать с параметром stdcall, компилятор изврашается и пишет в имя функции длину всех параметров. Как правило это стараются убить, так как такие надписи зависят очень сильно от компилятора. И это не удобно в дальнейшем использовании. Добавлено @ 19:41 В любом случае, тебе должны предоставлятся загаловочные файлы библиотеки. Иначе все это изобретание велосипеда. -------------------- Пролетал мимо. |
|||
|
||||
| rsm |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 999 Регистрация: 16.3.2005 Репутация: 1 Всего: 62 |
В теории, определение количества аргументов функции производится так - с самого начала функции ищем инструкции вида:
где: reg - некоторый регистр (eax, ebx...), Z - число от 8 и до N. Просматривая все такие инструкции, смотрим, где число N максимально. Затем делим это число на 4 - получаем количество параметров функции. Данный способ универсален для всех типов функций кроме fastcall. Однако в нем есть еще несколько хитростей (о них я не написал). Для stdcall & pascal способ проще - ищем в конце функции инструкцию вида:
Делим Z на 4 - получаем количество аргументов. Для cdecl количество параметров определяется по инструкции вида:
, идущей следом за вызовом функции. Делим Z на 4 - получаем количество аргументов. Это сообщение отредактировал(а) rsm - 23.1.2006, 14:19 |
||||||
|
|||||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |