![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Illusion Dolphin |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Теперь очень интересно стало, раз можно в рунтайм находить компоненты и их свойства, и к ним обращаться, возможно ли находить по имени каким-либо образом функции, лежащие в подключаемых модулях, и их вызывать?.. Т.е. что-то вроде
y:=findfunction('cos',x); //y:=cos(x); -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
<Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
Ну если тебе известно имя функции(так же ее параметры) и она экспортируется по имени, то ищи ее при помощи GetProcAddress.
-------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
p0s0l |
|
||||||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Хотя это не так просто, как ты подумал, Illusion Dolphin, но всё же можно это реализовать...
Внале нужно узнать адрес функции: 1) Если функция является апишной, или просто из какой-то DLL, то GetProcAddress. Так можно узнать функцию по её названию, пример: GetProcAddress(hModule, 'GlobalAlloc'); 2) Если функция таковой не является, то адрес её можно получить так: @FunctionName или Addr(FunctionName). Только тут загвоздка в том, что FunctionName - это уже не строковый параметр, а сама функция. Пример: FuncAddr := @AnsiLowerCase или FuncAddr := Addr(AnsiLowerCase); Так что тебе придется сделать что-то подобное:
Только как видишь, нужно при создании программы знать, какие функции ты будешь использовать... 3) Если ты со вторым пунктом смиришься, то встретишь такую пакость: Это будет работать, но не со всеми функциями и процедурами. Так будет работать только с малой частью функций модуля System и со всеми функциями других модулей... Вот, например, с Cos или Sin так не пройдет. Если тебе надо использовать именно их, то придется делать липовые функции-переадресаторы:
и тогда в FindFunc будет так:
4) И всё равно есть функции, с которыми так дело не пройдет вообще (WriteLn, например). Получив таким образом адреса функций можно их использовать. Только нужно для каждого типа функций создавать свой тип:
Уфф... Вроде ничего не упустил... Короче много ограничений... -------------------- С уважением, г-н Посол. |
||||||||
|
|||||||||
Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
В готовом EXE файле названий функций нет, следовательно на этапе компиляции надо знать какие функции будут искаться, иначе никак.
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 14 Всего: 48 |
Можно использовать MAP файлы, но все же для того что бы функция попала в готовый экзешник она должна вызываться где-то в исходниках, иначе компилер просто не включит ее.
-------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 14 Всего: 48 |
ну это не обязательно можно сделать такую функцию: function DoRegisterCall(func: Pointer; params: array of const): DWORD; такое я уже делал если понадобиться могу найти. -------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |