Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.07.2009, 17:31   #11
The Best
Пользователь
 
Регистрация: 17.12.2008
Сообщений: 50
По умолчанию

Точно так же как и в случае с несовпадением названия файла с названием процедуры..
The Best вне форума Ответить с цитированием
Старый 19.07.2009, 17:40   #12
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

Вам нужно создать свой интерфейс (API)
Levsha100 вне форума Ответить с цитированием
Старый 19.07.2009, 18:13   #13
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
По умолчанию

У меня есть StringGrid1
Как загрузить в один столбик файлы dll из определенной папки (а иенно "plugins"), а в соседнюю строку с именем файла загрузить текст с файла *.ini что имеет одинаковое имя с *.dll

-----------------------------------------
sm.dll | Текст с файла sm.ini
-----------------------------------------
kill.dll | Текст с файла kill.ini
-----------------------------------------
run.dll | Текст с файла run.ini
-----------------------------------------
W0LF вне форума Ответить с цитированием
Старый 19.07.2009, 19:47   #14
The Best
Пользователь
 
Регистрация: 17.12.2008
Сообщений: 50
По умолчанию

ты имеешь ввиду зугрузить нзвания файлов DLL? И содержимое ini?
The Best вне форума Ответить с цитированием
Старый 19.07.2009, 23:51   #15
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Мда.. народ, слов нет как обычно запудрили парню мозги (или он сам себе). Ну в сети как бы четко и на все вопросы статьи вы врядли найдете, хотя чудеса встречаются. А так, вот мой подход, может чего и себе возьмете

1. Создается новый модуль (.pas) в котором описываите один класс - одна .dll - один плагин, к примеру TPlugin, как нистранно, а так же класс TPlugins - на основе TList, ведет он себя по сути как TStringList только работает (Items возращает, удаляет, добовляет, ищет и т.п.) не со String, а с TPlugin.

2. TPlugin - должен иметь FileName (полный путь .dll), методы Load, Unload (для загрузки LoadLibraryW, и выгрузки FreeLibrary), и конечно же набор вспомогательных функций. Например

Код:
function pluginGetInformation(szName: PWChar; szAuthor: PWChar; szDescription: PWChar; dwVer: DWord): Boolean; stdcall;
function pluginGetType: Integer; stdcall;
3. по названиям думаю ясно, pluginGetType - для проверки при поиске ваших плагинов в определенной папке вашей программы (было сказано выше). То что будет возращано pluginGetType может к примеру, описывать предназначение плагина, и в соответствии обрабатываться в вашем приложении.

Собственно и все. В кратце, мини-статься можно сказать.
BOBAH13 вне форума Ответить с цитированием
Старый 20.07.2009, 07:06   #16
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию Плагины

По примеру ВОВАНА13, а то про плагины мало (см. внизу страницы) :

Так как в Delphi статическая типизация вы можете сделать общий плагин только над одним множеством функций, например функций от целого, возвращающих целое. Т.е. нет обобщенных процедурных типов... С другой стороны обычной процедуры без параметров хватает за глаза.

Код:
// Главное приложение

...

type
  Proc_Action = procedure;

type TPlugIn =  class(TObject)
  private
    hndDLL : THandle;
  public
    constructor Create(fileDLL :  string);
    destructor Destroy; override;
    function GetApplication : TApplication; virtual; stdcall;
    function LoadFunction_Action (nameFun :  string) : Proc_Action;
end;

type TMainForm =  class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    PlugIn : TPlugIn;
    MyAct  : Proc_Action;
end;

var
  MainForm: TMainForm;
BaronTreep вне форума Ответить с цитированием
Старый 20.07.2009, 07:08   #17
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Код:
implementation

{ TPlugIn }

constructor TPlugIn.Create (  fileDLL : string );
  type TInitPlugin = procedure (PlugClass :  TPlugIn);
  var InitPlugin : TInitPlugin;
  begin
    hndDLL :=  loadLibrary(PChar(fileDLL));
    if Longint(hndDLL)  <> 0 then  begin try
      @InitPlugin :=  GetProcAddress(hndDLL,  'InitPlugin');
      if  Longint(@InitPlugin)  <> 0 then  begin try
          InitPlugin ( Self );
        except
          raise Exception.Create('Сбой  функции инициализации');
        end;
      end else raise  Exception.Create('В плагине нет функции  инициализации');
      except
        raise Exception.Create('В плагине  нет функции инициализации');
      end;
    end else raise  Exception.Create('Нет такого плагина  ' + fileDLL);
end;

destructor TPlugIn.Destroy;
begin
  freeLibrary(hndDLL);
end;

function TPlugIn.GetApplication : TApplication;
begin
  Result := Application;
end;

function TPlugIn.LoadFunction_Action  (nameFun: string) : Proc_Action;
var
  adrFun : Proc_Action;
begin
  Result := nil;
  try
    @adrFun :=  getProcAddress(hndDLL,  PChar(nameFun));
    if addr(adrFun)  <> nil then
       Result := adrFun
    else raise  Exception.Create('Нет такой функции  ' + nameFun);
  except
    raise Exception.Create('Нет такой  функции ' + nameFun);
  end;
end;

{$R *.DFM}

procedure TMainForm.FormCreate(Sender:  TObject);
begin
  Plugin :=  TPlugin.Create('plugin.dll');
end;

procedure TMainForm.FormDestroy(Sender:  TObject);
begin
  Plugin.Free;
end;

procedure TMainForm.Button1Click(Sender:  TObject);
begin
  MyAct :=  Plugin.LoadFunction_Action(Edit1.Text);
  MyAct;
end;

end.

Последний раз редактировалось BaronTreep; 21.07.2009 в 00:25.
BaronTreep вне форума Ответить с цитированием
Старый 20.07.2009, 07:09   #18
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Потом сочиняем такой плагин:

Код:
library Plugin;

uses
  SysUtils, Classes, Forms;
  
{$R *.RES}

// Сюда можно в принципе и форму засунуть (New -> Form)

type TPluginInterface = class
  public
    function GetApplication : TApplication; virtual; stdcall; abstract;
end;

var
  InterF : TPluginInterface;

// Обязательно
procedure initPlugin(PlugClass : TPluginInterface);
begin
  InterF := PlugClass;
end;

function RGB(r,  g, b: byte) :  integer;
begin
  Result := (r or (g shl  8) or (b shl  16));
end;

procedure DoRed; export; stdcall;
begin
   InterF.GetApplication.MainForm.Color := RGB(255,  0, 0);
end;

procedure DoGreen; export; stdcall;
begin
   InterF.GetApplication.MainForm.Color := RGB(0,  255, 0);
end;

procedure DoBlue; export; stdcall;
begin
   InterF.GetApplication.MainForm.Color := RGB(0,  0, 255);
end;

exports InitPlugin name 'InitPlugin';
exports DoRed name 'DoRed';
exports DoGreen name 'DoGreen';
exports DoBlue name 'DoBlue';

begin
end.
Как видете какие бы процедуры вы сюда не вставили, все они могут быть вызваны просто по имени. То, что в главном модуле имеется function GetApplication : TApplication; virtual; stdcall;, а в плагине function GetApplication : TApplication; virtual; stdcall; abstract; приводит к тому, что GetApplication вызывается фактически из главного приложения.

Потом можно устроить список - пробегать Find-ом по директории, собирать все dll и добавлять в список те которые инициализировались. Список доступных имен функций, как говорилось, можно брать из в ini файла.

Последний раз редактировалось BaronTreep; 20.07.2009 в 15:01.
BaronTreep вне форума Ответить с цитированием
Старый 20.07.2009, 20:50   #19
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
По умолчанию

Вот суть, вообще, програмы... Програма управляет компьютером по icq протаколу. В ней вводиться Команда и Название функции/процедуры которая вызываеться по этой команде. Пример: "!cd,open" - "cd-open", процедура "cd-open" открывает сидюк, так же в папке Plugins есть файл cd-open.dll с данной функцией... надо что бы прога загружала список доступных функций из dll, всмысле загружала имена dll без расширения ".dll", функции будут иметь названия самих файлов и будет видно какие именно доступны для использования и при запуске подключает все dll из папки Plugins
W0LF вне форума Ответить с цитированием
Старый 21.07.2009, 00:14   #20
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Цитата:
Вот суть, вообще, програмы...
Нада писать, однако. Вот вам есче кусок, прикрутите к тому, что я писал выше:

Код:
procedure TMainForm.FormCreate(Sender: TObject);
var
  Found, Attr  : integer;
  SearchRec    : TSearchRec;
  PluginHandle : THandle;
  PlugDir      : string;
begin
  PlugInList := TPlugInList.Create;
  PlugDir    := ExtractFilePath (Application. ExeName) + 'Plugins\';
  Attr       := faReadOnly or faHidden or faSysFile or faArchive;
  Found      := FindFirst(PlugDir + '*.dll', Attr, SearchRec);
  while Found = 0 do begin try
    Plugin := TPlugin.Create(PlugDir + SearchRec.Name);
    ListBox1.Items.Add(PlugDir + SearchRec.Name);
    // PlugInList.add(Plugin);
    except
      raise Exception.Create('AyYaAy');
    end;
  Found := FindNext(SearchRec);
  end;
  FindClose(SearchRec);
end;
Теперь все dll из папки plugins, если они инициализируются, заносятся в список. Вам всего-то осталось организовать TList (делайте поинтеры) и пробежать по таблице экспорта в каждой dll.

Что касается открыть CD-ROM, то это как из пушки по воробьям, зачем плагины? Впрочем можете добавить в плагин такую функцию, и назвать её.

Последний раз редактировалось BaronTreep; 21.07.2009 в 00:29.
BaronTreep вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Плагины dani92 Общие вопросы Delphi 3 17.04.2009 15:05
Как реализовать плагины в Дельфи Лубышев Общие вопросы Delphi 3 20.02.2009 15:41
Плагины к программе. Dr.Badnezz Общие вопросы Delphi 2 20.02.2009 15:40
Помогите реализовать mental Помощь студентам 0 07.01.2009 01:17
Помогите реализовать ReacXX Общие вопросы Delphi 3 26.05.2008 08:56