Главная страница
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.022 c
1-1086406763
mr.Delphin
2004-06-05 07:39
2004.06.20
Сжать или растянуть


1-1086672440
BanderLog_t
2004-06-08 09:27
2004.06.20
TreeView с CheckBox


1-1086703288
Tack83
2004-06-08 18:01
2004.06.20
Вызов DLL, написанной в C++


1-1086192848
Damager
2004-06-02 20:14
2004.06.20
Как переименовать папку


14-1086257689
AlexG
2004-06-03 14:14
2004.06.20
Борьба с региональными настройками.