Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.20;
Скачать: CL | DM;

Вниз

Массив адресов функций. Это возможно?   Найти похожие ветки 

 
ZHK ©   (2004-06-04 08:14) [0]

Господа. Всегда хочется чего-то большого и светлого, что приводит к поиску проблем на свою, в лучшем случае, голову. Такая тема. Можно ли как-нибудь заставить компилятор, да, именно компилятор на стадии компиляции, заставить сделать массив адресов описанных в модуле функций, дабы потом по запросу передавать во вне наборы адресов под конкретную задачу? А вообще это все пришло мне в голову при попытке написания плагинов. Общий принцип - в DLL помещаю кучу объектов TTabSheet и туда же - функции для обработки их событий. Создаются объекты динамически и, собственно, настройка событий для каждого - дело хлопотное. Восстановление же адресов функций обработки событий из массива - на первый взгляд приятное дополнение. Только возможно ли?


 
Романов Р.В. ©   (2004-06-04 08:39) [1]

Сложный велосипед какой то. Вы почитайте литературу по написанию плагинов, может прояснится в голове.


 
bars ©   (2004-06-04 08:52) [2]

При каждой загрузке ДЛЛ все адреса в ней ставятся поновой. Т.е. нельзя их просто так сначала записать. Но можно отдать их программе очень легко. даже в виде массива.
DLL>>

library *
...
uses ShareMem{ Обязательно на первом месте }....;
...
type TArrayOfProcs=array of TFarProc;
...
procedure YourProc1; stdcall;
begin
{ Содержание экспортитуемой процедуры №1 }
end;

procedure YourProc2; stdcall;
begin
{ Содержание экспортитуемой процедуры №2 }
end;
...
function GetProcArray:TArrayOfProcs; stdcall;
begin
setlength(result,0);
setlength(result,length(result)+1);
result[length(result)-1]:=@YourProc1;
setlength(result,length(result)+1);
result[length(result)-1]:=@YourProc2;
...
end;

exports GetProcArray;

*.DPR>>

program *
...
uses ShareMem{ Обязательно на первом месте }....;

UNIT.PAS>>

...
type TArrayOfProcs=array of TFarProc;
type TSimpleProc = procedure;
{ Внимание! TSimpleProc должен совпадать с YourProc# }
...
var dll_array:TArrayOfProcs;
...
{ надеюсь ты уже импортировал в прогу функцию GetProcArray }
dll_array:=GetProcArray;
{ все! мы получили массив функций, теперь попробуем их повызывать }
{ Вызываем YourProc1 }
TSimpleProc(dll_array[0]);
{ Вызываем YourProc2 }
TSimpleProc(dll_array[1]);

Может есть неточности, но теоретически все так.


 
Digitman ©   (2004-06-04 09:12) [3]


> и туда же - функции для обработки их событий


обработчики событий компонентов - не функции, а процедурные методы

т.е. если приспичило держать все это хозяйство в массиве, то этементы массива должны иметь тип TMethod



Страницы: 1 вся ветка

Текущий архив: 2004.06.20;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.046 c
3-1085643265
Kraw
2004-05-27 11:34
2004.06.20
Программирование TDBGrid


14-1085944450
Тимур
2004-05-30 23:14
2004.06.20
Game Shark


1-1086250968
Rulezz
2004-06-03 12:22
2004.06.20
Алгоритм


6-1083253140
Need_HELP:-)
2004-04-29 19:39
2004.06.20
Нужен исходник чата


1-1086250759
Дима
2004-06-03 12:19
2004.06.20
ImageList