Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как динамически добавить модули в программу?


Автор: kemper 7.7.2003, 15:19
Мне надо написать программу, которая бы получала на вход данные(файл) и обрабатывала эти данные различными алгоритмами. Алгоритмы могут быть оформленны как функции:
function f1(a:vectorA):vectorB.
Но алгоритмы могут со временем изменятся и добавлятся новые.

Объясню, что я хочу сделать:
Каждую функцию поместить в модуль и подключать эти модули к программе прописывая их в конфиг-файле. Пользователь выбирает алгоритм и обрабатывает данные.

Вопрос:
Как мне вызвать функцию из модуля, который прописан в конфиг-файле?
Если это в Delphi зделать нельзя подскажите свои варианты решения проблемы.

Заранее благодарен.

Автор: eof 7.7.2003, 15:28
надо использовать интерпретатор, например visual basic, fox pro и т.п. или писать свой парсер на делфях. Все зависит от того на сколько сложные будут алгоритмы.
Есть еще вариант, когда алгоритм рассчета реализован в длл. Если нужно изменить алгоритм, то достаточно перекомпилять (заменить) длл, а проект можно не трогать. Лично я терпеть не могу интерпретаторы, хотя в твоей задаче возможно это оптимально.

Автор: kemper 7.7.2003, 15:50
Спастибо
Алгоритмы простые(20-30 строчек, без условий). Как мне сделать dll или где можно об этом прочитать???

Автор: <Spawn> 7.7.2003, 16:58
Создаешь новый проект так - File>New>Other>DLL Wizard. Это будет заготовка под модуль ДЛЛ. Затем описываешь в нем свои функции/процедуры. И те, которые ты хочешь использовать в своей проге,обьявляешь экспортируемыми. Все примерно так.

Код
function f1(a:vectorA):vectorB;stdcall;export;
begin
<тело функции>
end;


exports
f1;


Для того чтобы создать новую ДЛЛ Run не прокатит - используй, например,Project>Build All Projects;

В своей проге их можно использовать по разному. Например, обьявляешь ее прототип так

Код
function f1(a:vectorA):vectorB;stdcall;external 'Mydll.DLL';

Тогда загрузчик сам позаботится о подключении ДЛЛ к твоей проге. А можно это делать динамически:

Код
var
hLib:THandle;

procedure TForm1.Button1Click(Sender:TObject);
var
f1:function(a:vectorA):vectorB;stdcall; //Прототип твоей функции
begin
hLib:=LoadLibrary('Mydll.DLL');
if hLib>HINSTANCE_ERROR then
begin
@f1:=GetProcAddres(hLib,'f1');
if @f1<>nil then
 VectorB:=f1(VectorA)
else
ShowMessage('Невозможно получить адрес функции');
end;
end;


Вот примерно так нада использовать ДЛЛ.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)