Проблема с подгружаемыми bpl
От: Аноним  
Дата: 17.09.04 12:49
Оценка:
Ситуация: реализован интерфейс плугинов с использованием собственно
интерфейсов. каждый плугин при свое загрузке регистрируется в программе

type
  TfmDouble = class(TPluginAutomationForm) //форма плугина
   ....
   procedure _SetAutomationFileName(Value:string); override;
   ....
   property AutomationFileName: string read fAutomationFileName write
_SetAutomationFileName;
  end;
initialization
  if not Assigned(GetClass('TfmDouble')) then RegisterClass(TfmDouble);


загружаем плугин LoadPackage(PlugInList[i]);
и далее при вызове плугина


var frmClass: TFormClass;

frmClass := TFormClass(GetClass('TfmDouble'));
if Assigned(frmClass) then   frmClass.Create(Self);


все это работает прекрасно.

но если далее

frmPlugin:= TPluginAutomationForm(frmClass);
frmPlugin.AutomationFileName:= 'полный путь к комендному файлу';

должна вызываться процедура _SetAutomationFileName, однако нет ошибка
именно в последней строке access violation in module shell32.dll

причем тип TPluginAutomationForm описан в общем рантайм модуле.

type
 TPluginAutomationForm = class(TForm)
   private
    fAutomationFileName: string;
   public
    procedure _SetAutomationFileName(Value:string); virtual; abstract;
   published
    property AutomationFileName: string read fAutomationFileName write
_SetAutomationFileName;
 end;


Подскажите, в чем тут могут быть грабли????
Может быть имеет смысл описать класс процедуру и ей передавать параметры, но
тогда теряется идее гибкости, когда использую rtti можно присвоить свойству
необходимый параметр.
+ в чем принципиальная разница класс и не класс процедур, досих пор не
уловил ?
Re: Проблема с подгружаемыми bpl
От: Аноним  
Дата: 17.09.04 12:52
Оценка:
Сорри, не подписался Владимир Сучков vladimir_suchkov@inbox.ru
Re: Проблема с подгружаемыми bpl
От: Oleg A. Bachin Украина  
Дата: 17.09.04 14:30
Оценка:
Здравствуйте, Аноним, Вы писали:

А>но если далее

А>frmPlugin:= TPluginAutomationForm(frmClass);
А>frmPlugin.AutomationFileName:= 'полный путь к комендному файлу';
А>должна вызываться процедура _SetAutomationFileName, однако нет ошибка
А>именно в последней строке access violation in module shell32.dll

давай определимся вот тут...
что такое frmPlugin? экземпляр плагина? а что такое frmClass? суть улавливаешь?
Best regards,
Oleg A. Bachin
Re: Проблема с подгружаемыми bpl
От: Diouzshev Россия  
Дата: 17.09.04 16:37
Оценка:
> + в чем принципиальная разница класс и не класс процедур, досих пор не
> уловил ?

класс процедуру можно вызвать как TMyForm.ClassProc и в них, соответственно нет Self, недоступны значения св-в
для твоего примера это могло выглядеть так:

initialization
if not Assigned(GetClass('TfmDouble')) then RegisterClass(TfmDouble);
PluginList.Add(TfmDouble.PluginTitle); // т.е. добавляем название в список плагинов

With best regards, Alexander Diouzshev-Maltsev.
Posted via RSDN NNTP Server 1.9 gamma
Re[2]: Проблема с подгружаемыми bpl
От: svgforum  
Дата: 18.09.04 05:07
Оценка:
Здравствуйте, Oleg A. Bachin, Вы писали:

OAB>Здравствуйте, Аноним, Вы писали:


А>>но если далее

А>>frmPlugin:= TPluginAutomationForm(frmClass);
А>>frmPlugin.AutomationFileName:= 'полный путь к комендному файлу';
А>>должна вызываться процедура _SetAutomationFileName, однако нет ошибка
А>>именно в последней строке access violation in module shell32.dll

OAB>давай определимся вот тут...

OAB>что такое frmPlugin? экземпляр плагина? а что такое frmClass? суть улавливаешь?

другими словами надо описать тип TPluginAutomationFormClass = class of TPluginAutomationForm;
но тогда будут видны только класс методы, каков может быть выход?
Re: Проблема с подгружаемыми bpl
От: Sinclair Россия https://github.com/evilguest/
Дата: 20.09.04 08:28
Оценка:
Здравствуйте, <Аноним>, Вы писали:


А>frmClass := TFormClass(GetClass('TfmDouble'));

А>if Assigned(frmClass) then frmClass.Create(Self);

А>все это работает прекрасно.

Ага. Вот в этот момент ты создал экземпляр класса. Но увы — ссылку на него ты зачем-то выбросил. Кто будет сохранять результат frmClass.Create?
frmPlugin:= TPluginAutomationForm(frmClass);
frmPlugin.AutomationFileName:= 'полный путь к комендному файлу';

Здорово. Какого типа у нас frmClass? Формально — TFormClass, т.е. class of TForm, на самом деле, ессно, class оf TPluginAutomationForm. А ты его к чему приводишь? Првильно, к просто TPluginAutomationForm. Вот и возникают грабли. Ты пытаешься вызвать методы экземпляра на классе. Надо так:

frmPlugin:= TPluginAutomationForm(frmClass.Create(self));
frmPlugin.AutomationFileName:= 'полный путь к комендному файлу';
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.