Главная страница
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.039 c
4-1084346828
naked
2004-05-12 11:27
2004.06.20
мониторинг файловой системы


14-1086152166
Anatoliy
2004-06-02 08:56
2004.06.20
Курорты Турции


14-1086255952
Отшельник
2004-06-03 13:45
2004.06.20
Увеличить громкость в avi файле


8-1080807221
ИЛЕЙ
2004-04-01 12:13
2004.06.20
Замедление и ускорение звука


1-1086690046
dimuch
2004-06-08 14:20
2004.06.20
Подскажите по вопросу о иерархии