Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Findfunction ??? 
:(
    Опции темы
Illusion Dolphin
  Дата 3.10.2003, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



Теперь очень интересно стало, раз можно в рунтайм находить компоненты и их свойства, и к ним обращаться, возможно ли находить по имени каким-либо образом функции, лежащие в подключаемых модулях, и их вызывать?.. Т.е. что-то вроде
y:=findfunction('cos',x); //y:=cos(x);


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
<Spawn>
Дата 3.10.2003, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Ну если тебе известно имя функции(так же ее параметры) и она экспортируется по имени, то ищи ее при помощи GetProcAddress.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
p0s0l
Дата 3.10.2003, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 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);
Так что тебе придется сделать что-то подобное:
Код
function FindFunc (const FuncName : string) : pointer;
begin
 if FuncName = 'Cos' then Result := @cos
 else if FuncName = 'Sin' then Result := @sin
 else if FuncName = 'AnsiLowerCase' then Result := @AnsiLowerCase
 ...
end;

Только как видишь, нужно при создании программы знать, какие функции ты будешь использовать...
3) Если ты со вторым пунктом смиришься, то встретишь такую пакость:
Это будет работать, но не со всеми функциями и процедурами. Так будет работать только с малой частью функций модуля System и со всеми функциями других модулей...
Вот, например, с Cos или Sin так не пройдет. Если тебе надо использовать именно их, то придется делать липовые

функции-переадресаторы:
Код
function my_Cos (x : real) : real;
begin
 Result := Cos(x);
end;

procedure my_Append (var f : TextFile);
begin
 Append (f);
end;

...

и тогда в FindFunc будет так:
Код
 if FuncName = 'Cos' then Result := @my_Cos
 else if FuncName = 'Append' then Result := @my_Append
 else if ...

4) И всё равно есть функции, с которыми так дело не пройдет вообще (WriteLn, например).

Получив таким образом адреса функций можно их использовать.
Только нужно для каждого типа функций создавать свой тип:
Код
type
 TRealFunc_Real = function (x : real) : real; // подойдёт для Cos, Sin...
 TIntegerFunc_Real = function (x : real) : integer; // Подойдёт для Round, Trunc...
 TProc_StrRealInt = procedure (const s : string; var V; var i : integer); // для Val

 ...

begin
 y := TRealFunc_Real(FindFunc('Cos'))(x); // y := Ros(x);
 i := TIntegerFunc_Real(FindFunc('Round'))(x); // i := Round(x);
 TProc_StrRealInt(FindFunc('Val'))('123.456', R, Code); // Val('123.456', R, Code); // (R : Real)
end;


Уфф... Вроде ничего не упустил... Короче много ограничений...




--------------------
С уважением, г-н Посол.
PM   Вверх
Vit
Дата 3.10.2003, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
PM MAIL WWW ICQ   Вверх
stab
Дата 4.10.2003, 02:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



Можно использовать MAP файлы, но все же для того что бы функция попала в готовый экзешник она должна вызываться где-то в исходниках, иначе компилер просто не включит ее.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
stab
Дата 4.10.2003, 02:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



Цитата
Только нужно для каждого типа функций создавать свой тип


ну это не обязательно можно сделать такую функцию: function DoRegisterCall(func: Pointer; params: array of const): DWORD;

такое я уже делал если понадобиться могу найти.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1246 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.