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. Код взят из проектов и рабочий,
я гарантирую это.
Незнакомые функции и процедуры смотрите в справке Delphi.
P.P.P.S. Вообще с формой настроек лучше работать асинхронно, не тормозя плагин (и DM). Если интересно, пишите.