Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.02 c
14-1086169762
t100
2004-06-02 13:49
2004.06.20
Автоматизация почты


1-1086671643
Solo_
2004-06-08 09:14
2004.06.20
Вопрос по технологии Code Completitor


1-1086264193
Прямой
2004-06-03 16:03
2004.06.20
Панельку надо


1-1086745884
Глеб
2004-06-09 05:51
2004.06.20
Код завершения процесса


6-1083154069
ultracrash
2004-04-28 16:07
2004.06.20
Как созранить страничку в ВебБраузере




   Наверх