Главная страница
    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.45 MB
Время: 0.024 c
14-1086315136
Думкин
2004-06-04 06:12
2004.06.20
С днем рождения!


1-1086755177
Softal
2004-06-09 08:26
2004.06.20
Treeview


9-1077830655
spogi
2004-02-27 00:24
2004.06.20
sozdaniie i proverka


3-1085730819
DimonNew
2004-05-28 11:53
2004.06.20
Binary


1-1086607879
sesh
2004-06-07 15:31
2004.06.20
Запись в текстовый файл в DOS кодировке





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский