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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.09.2011, 17:14   #1
Shad0w64bit
Пользователь
 
Регистрация: 09.05.2009
Сообщений: 12
По умолчанию Создание компонента из DLL

Здравствуйте. Возник вопрос. Нужно реализовать что то на подобии плагинов. Для этого я опрашиваю все DLL в папке и нужно что бы при выборе определенного плагина он подключался к компоненту на форме.
Delphi 2010, компонент SynEdit.
В демо есть код

Код:
...
TSynSampleSyn = class(TSynCustomHighlighter)
...

procedure TForm1.FormCreate(Sender: TObject);
var
  HL: TSynSampleSyn;
begin
  HL := TSynSampleSyn.Create(Self);
  SynEdit1.Highlighter := HL;
end;
У меня в коде формы
Код:
var
  Form1: TForm1;
  GetHightlighter: function (Self: TComponent): TSynCustomHighlighter;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  LibHandle: THandle;
begin
  @GetHightlighter := nil;
  LibHandle := LoadLibrary('Sample.dll');
  if LibHandle >= 32 then
  begin
    @GetHightlighter := GetProcAddress(LibHandle,'GetHightlighter');
      if @GetHightlighter <> nil then begin
        SynEdit1.Highlighter:=GetHightlighter(self);
      end;
  end;
  FreeLibrary(LibHandle);
end;
А в коде DLL
Код:
function GetHightlighter(Self: TComponent): TSynCustomHighlighter; stdcall;
var
  HL: TSynSampleSyn;
begin
  HL := TSynSampleSyn.Create(Self);
  result:=HL;
end;

exports GetHightlighter;
При отображении в SynEdit выскакивает ошибка
access violation at address.
Я так понимаю что ошибка прав доступа подскажите как исправить?
Shad0w64bit вне форума Ответить с цитированием
Старый 26.09.2011, 17:19   #2
Shad0w64bit
Пользователь
 
Регистрация: 09.05.2009
Сообщений: 12
По умолчанию

при этом если не освобождать DLL
Код:
//FreeLibrary(LibHandle);
то работает но при каждом изменении ругается
access violation at address in module 'sample.dll'

а если освобождать то при каждом изменении
access violation at address in module 'sample.dll'
access violation at address

Последний раз редактировалось Shad0w64bit; 26.09.2011 в 17:27.
Shad0w64bit вне форума Ответить с цитированием
Старый 26.09.2011, 17:59   #3
Silver_S
Форумчанин
 
Регистрация: 14.03.2011
Сообщений: 104
По умолчанию

Не указано соглашение о вызове
Код:
    GetHightlighter: function (Self: TComponent): TSynCustomHighlighter; stdcall;
Добавлено:
Учитывая, что "работает но при каждом изменении ругается", наверное ошибка не в этом

Последний раз редактировалось Silver_S; 26.09.2011 в 18:13.
Silver_S вне форума Ответить с цитированием
Старый 26.09.2011, 20:31   #4
Shad0w64bit
Пользователь
 
Регистрация: 09.05.2009
Сообщений: 12
По умолчанию

Спасибо большое! без освобождения Dll и с добавленым stdcall; все работает.

Я на это внимание обращал но в примере stdcall не было и там текст с кодом работал.
Shad0w64bit вне форума Ответить с цитированием
Старый 26.09.2011, 20:40   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

смотри похожие темы внизу станицы.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание компонента Alex54 C++ Builder 0 03.04.2011 13:16
Динамическое создание компонента из компонента)) Impuls1989 Компоненты Delphi 8 22.10.2009 00:08
создание компонента из dll Filil Компоненты Delphi 4 14.09.2009 23:04
Посылаем адресс компонента в dll Altera Общие вопросы Delphi 23 28.04.2008 20:36
Посылаем адресс компонента в dll Altera Общие вопросы Delphi 0 27.04.2008 05:50