
Продолжение... Начало в статье - Как создавать плагины на Дельфи? Часть 1...
Сама процедура по выполненю плагина.
Теперь мы загружаем тип узнаём и далее выполняем
procedure TForm1.PlugClick(sender: TObject);
var
//проводим объявление функции, которая далее и будет плагин выполнять
PlugExec : function(AObject : TObject): boolean;
//здесь идет объявление функции, возвращая тип плагина
PlugType : function: PChar;
//тут Имя dll
FileName : string;
//тут Хендл dll
handle : Thandle;
begin
with (sender as TmenuItem) do
filename:= plugList.Strings[MenuIndex];
//здесь получаем имя dll
handle := LoadLibrary(Pchar(FileName)); //Загружаем dll
//В том случае, когда всё ОК, продолжаем…
if handle <> 0 then
begin
//Далее загружаем функции
@plugExec := GetProcAddress(handle,'PluginExec');
@plugType := GetProcAddress(handle,'PluginType');
//Продолжая, в зависимости от самого типа, ей нужный параметр передаём...
if PlugType = 'FORM' then
PlugExec(Form1)
else
//В том случае, когда плагин для формы, то форму передаём
if PlugType = 'CANVAS' then
PlugExec(Canvas)
else
//В том случае, когда плагин для канвы, то саму канву передаём
if PlugType = 'MENU' then
PlugExec(MainMenu1)
else
//Когда плагин для меню, то именно меню передаём
if PlugType = 'BRUSH' then
PlugExec(Canvas.brush)
else
//Когда плагин для заливки, то саму заливку и передаём
if PlugType = 'NIL' then
PlugExec(nil);
//Когда плагину нашему не надо ничего, то и не передаём ничего
end;
FreeLibrary(handle); //Уничтожаем dll
end;
procedure TForm1.FormCreate(Sender: TObject);
var
SearchRec : TSearchRec; //здесь запись для поиска
begin
plugList:=TStringList.create; //здесь создаём запись для имён dll'ок
//а здесь ищем еще первый файл
if FindFirst('*.dll',faAnyFile, SearchRec) = 0 then
begin
LoadPlug(SearchRec.name); //тут найденный первый файл загружаем
while FindNext(SearchRec) = 0 do
LoadPlug(SearchRec.name);
//здесь загружаем последующий
FindClose(SearchRec); //уже закрываем наш поиск
end;
//тут левые параметры
canvas.Font.pitch := fpFixed;
canvas.Font.Size := 20;
canvas.Font.Style:= [fsBold];
end;
end.
Давайте напишем обычный исходный текст dll, а именно нашего плагина. Он возвращает обязательно название, тип и еще выполняет собственные задачи
library plug;
uses
SysUtils, graphics, Classes, windows;
{$R bmp.RES}
function PluginType : Pchar;
begin
//здесь мы указали реакцию на данный тип
Plugintype := 'CANVAS';
end;
function PluginName:Pchar;
begin
//здесь название плагина. Даная строчка обьязательно будет в меню
PluginName := 'Canvas painter';
end;
Сама функция выполнения плагина! Тут рисуем мы анимационную строку на переданной канве.
function PluginExec(Canvas:TCanvas):Boolean;
var
X : integer;
I : integer;
Z : byte;
S : string;
color : integer;
proz : integer;
begin
color := 10;
proz :=0;
S:= 'привет всем - это из плагина )))';
for Z:=0 to 200 do
begin
proz:=proz+2;
X:= 0;
for I:=1 to length(S) do
begin
X:=X + 20;
Canvas.TextOut(X,50,S[i]);
color := color+X*2+Random(Color);
canvas.Font.Color := color+X*2;
canvas.font.color := 10;
canvas.TextOut(10,100,'execute of '+inttostr(proz div 4) + '%');
canvas.Font.Color := color+X*2;
sleep(2);
end;
end;
PluginExec:=True;
end;
exports
PluginType, PluginName, PluginExec;
end.
Несколько советов:
Не ставьте у собственных плагинов расширение *.dll, это не пройдет. А сделайте, к примеру *.plu . Для этого в исходном тексте плагина надо написатьшите {$E plu} , а также в исходном тексте программы найти необходимо не Dll, а plu.
А когда сдаёте вы программку, к ней пишите уже несколько готовых плагинов, чтобы пользователю интересно было новые искать.
Плюс, к тому же, сделайте обновления поддержки через сеть Интернет. Т. е. программа наша на сервер заходит, узнаёт, есть плагины новые либо же нет, в случае когда есть - то их она загружает. Всем этим увеличите вы спрос собственной программы и также трафик собственного сайта!
Спонсор поста: желаете экономить на собственных покупках? Начните покупать в Интернете! Красочный интернет магазин top-shop.ru, предлагает широкий асортимент продукции, начиная от косметики и украшений, и заканчивая электроникой, товарами для дома и авто.