Ошибки при вызове с формы!

Все что касается разработки, отладки, использования подключаемых модулей.

Moderators: Korney San, marcipan

Post Reply
praeeo
Бывалый
Posts: 10
Joined: 12 Jul 2010, 8:46 Mon

Ошибки при вызове с формы!

Post by praeeo »

Помогите пожалуйста разобраться!

С формы при помощи процедуры

Code: Select all

procedure TForm1.Button2Click(Sender: TObject);
begin
TDMTestPlugIn.Create.DoMyAction('', '');
end;
вызываю из шаблона
функцию

Code: Select all

function TDMTestPlugIn.DoMyAction(action, parameters: WideString): WideString;
begin
myIDmInterface.DoAction('GetDownloadIDsList', '');//ЗДЕСЬ, ПРИ ОБРАЩЕНИИ К ИНТЕРФЕЙСУ, ВЫСКАКИВАЕТ ACCESS VIOLATION!
//Form1.Edit1.Text:= myIDmInterface.DoAction('GetDownloadIDsList', ''); - И ЗДЕСЬ, ЕСТЕСТВЕННО, ТОЖЕ!
end;
что вызывает ошибку
"Access violation at address 01C13A1C in module dmtest_plugin.dll.Read of address 00000000."
При вызове myIDmInterface.DoAction из самого шаблона через процедуру запуска моей формы TDMTestPlugIn.PluginConfigure все работает.
И еще:
При закрытии DM выскакивает ошибка:
"Инструкция по адресу 0х00000000 обратилась к памяти по адресу 0х00000000. Память не может быть read."
Что я делаю неверно?
Как и рекомендовано, модуль ShareMem прописан первым, но наверное это тут не при чем...
User avatar
Korney San
Гуру
Posts: 1116
Joined: 02 Oct 2006, 17:01 Mon
Location: Беларусь, Гомель
Contact:

Re: Ошибки при вызове с формы!

Post by Korney San »

praeeo wrote:

Code: Select all

procedure TForm1.Button2Click(Sender: TObject);
begin
TDMTestPlugIn.Create.DoMyAction('', '');
end;
Стандартная ошибка начинающего работать с интерфейсами - сам наступил на эти же грабли. :)
TDMTestPlugIn - это класс-реализатор интерфейса. Напрямую он создаётся только в программе-хосте (DM) через RegisterPlugIn. Но дело даже не в этом - у TDMTestPlugIn НЕТ метода DoAction, соотетственно система находит нереализованный метод и рапортует об ошибке. Ну а DM потом валится при попытке "убить" созданный объект.
Правильный способ "подключить" плагин к форме выглядит так:

Code: Select all

type
  TSetupForm = class(TForm)
  ...
  private
   FPlugin: TDMTestPlugIn;
   ...
  public
    property Plugin: TDMTestPlugIn read FPlugin write FPlugin;
    ...
  end;

procedure TSetupForm.FormCreate(Sender: TObject);
begin
 FPlugin:=nil; //исходное значение
 ...
end;
   
procedure TSetupForm.FormDestroy(Sender: TObject);
begin
 FPlugin:=nil; //освобождение экземпляра интерфейса (если был выделен)
 ...
end;
Далее в основном тексте плагина пишете что-то вроде

Code: Select all

 var 
  SF: TSetupForm = nil;
 ...
procedure TDMTestPlugIn.PluginConfigure(params: WideString);//вызов окна конфигурации плагина
begin
 if not Assigned(SF) then
  begin
   SF:=TSetupForm.Create(nil);
   SF.Plugin:=Self; //передача в форму экземпляра интерфейса
  end;
 if SF.ShowModal = mrOK then //модальный код кнопки закрытия
  begin
   ...
  end;
  ...
end;

procedure TDMTestPlugIn.BeforeUnload;
begin
 FreeAndNil(SF);
 ...
end;
И тогда в форме можете пользоваться всеми фишками напрямую:

Code: Select all

procedure TSetupForm.Button1Click(Sender: TObject);
begin
 if Assigned(FPlugin) then
   PlugIn.myIDmInterface.DoAction('', '');
end;
praeeo wrote:Как и рекомендовано, модуль ShareMem прописан первым, но наверное это тут не при чем...
Вы не поверите, но модуль ShareMem ВООБЩЕ не нужен. Точнее, он нужен ТОЛЬКО в тех случаях, когда выполняются оба условия:
1) У Вас в dll есть функции с результатом String;
2) Вы экспортируете эти функции.
Так как плагины никогда не экспортируют функций кроме RegisterPlugIn (ибо незачем), ShareMem можно с чистой совестью удалять из uses.

P.S. Не забудьте добавить в uses формы DMPluginIntf.
P.P.S. Код взят из проектов и рабочий, я гарантирую это. :D
Незнакомые функции и процедуры смотрите в справке Delphi.
P.P.P.S. Вообще с формой настроек лучше работать асинхронно, не тормозя плагин (и DM). Если интересно, пишите.
XPProSP3, DM 5.15.2.1341, Pale Moon 20.0.1, Opera Next 12.15 (1748) RTFM & STFF
Если Вы не можете быть хорошим примером, то Вам просто придётся служить ужасным предостережением. © Кэтрин Эйрд
praeeo
Бывалый
Posts: 10
Joined: 12 Jul 2010, 8:46 Mon

Re: Ошибки при вызове с формы!

Post by praeeo »

Korney San, огромное спасибо! Все работает )) Но на выходе по-прежнему выскакивала та ошибка
"Инструкция по адресу 0х00000000 обратилась к памяти по адресу 0х00000000. Память не может быть read.", даже когда плагин не был подключен, пока я не убрал тот самый ShareMem :lol: .
ЗЫ: Скромное пожелание - Может быть, вам и правда стоит вынести тему "Пример создания/подключения плагина" вверх, в раздел "Объявления"?, чтобы не отвечать каждый раз на простые вопросы, подобные моему? )
praeeo
Бывалый
Posts: 10
Joined: 12 Jul 2010, 8:46 Mon

Re: Ошибки при вызове с формы!

Post by praeeo »

ЗЗЫ: Либо добавить даже вот то, что Вы мне написали, в информацию к тестовому шаблону. Удачи Вам!
User avatar
Korney San
Гуру
Posts: 1116
Joined: 02 Oct 2006, 17:01 Mon
Location: Беларусь, Гомель
Contact:

Re: Ошибки при вызове с формы!

Post by Korney San »

praeeo wrote:Но на выходе по-прежнему выскакивала та ошибка
"Инструкция по адресу 0х00000000 обратилась к памяти по адресу 0х00000000. Память не может быть read.", даже когда плагин не был подключен, пока я не убрал тот самый ShareMem :lol: .
Хм... я сразу убрал его, потому не видел. Обычно у меня вылезают другие ошибки... :D
praeeo wrote:ЗЫ: Скромное пожелание - Может быть, вам и правда стоит вынести тему "Пример создания/подключения плагина" вверх, в раздел "Объявления"?, чтобы не отвечать каждый раз на простые вопросы, подобные моему? )
Эм... как правило, проблемы возникают именно с этим. После чего грамотный человек (а он грамотный, раз уж взялся писать плагин) поиском найдёт на форуме всё нужное. Что не найдёт, то спросит - но Вы второй за последние лет 5...
praeeo wrote:ЗЗЫ: Либо добавить даже вот то, что Вы мне написали, в информацию к тестовому шаблону.
Тестовый шаблон составляю не я, а разработчики. От себя я написал помощника в создании плагинов.
Более того - у меня уже давно совершенно другой тестовый шаблон. :D
XPProSP3, DM 5.15.2.1341, Pale Moon 20.0.1, Opera Next 12.15 (1748) RTFM & STFF
Если Вы не можете быть хорошим примером, то Вам просто придётся служить ужасным предостережением. © Кэтрин Эйрд
Post Reply