Текущий архив: 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.45 MB
Время: 0.024 c