Лучший способ получить возвращаемое значение с TJvPluginManager - PullRequest
3 голосов
/ 25 ноября 2010

В настоящее время я работаю в простой программе, которая реализует плагины с библиотеками dll (используя TJvPluginManager из JVCL Framework).

Пока я выясняю, как использовать этот компонент для обработки команд, но что, если я хочу получить возвращаемое значение из пользовательской функции внутри библиотеки ?. Можно ли вызвать определенную функцию с хоста с помощью TJvPluginManager? Как мне это реализовать?

Идея дыры состоит в том, чтобы иметь функцию, которая возвращает строку внутри каждой dll, чтобы ее можно было вызывать с помощью простого цикла. Я думаю, что могу сделать это вручную (используя динамическую загрузку), но я хочу как можно больше работать с TJvPluginManager.

Спасибо за ваше время. Джон Марко

1 Ответ

6 голосов
/ 25 ноября 2010

Я делаю это для реализации интерфейса в плагине и вызова его с хоста, например

MyApp.Interfaces.pas

uses
  Classes;

type
  IMyPluginInterface = interface
  ['{C0436F76-6824-45E7-8819-414AB8F39E19}']
    function ConvertToUpperCase(const Value: String): String;
  end;

implmentation

end.

Плагин:

uses
  ..., MyApp.Interfaces;

type
  TMyPluginDemo = class(TJvPlugIn, IMyPluginInterface)
  public
    function ConvertToUpperCase(const Value: String): String;
  ...

implmentation

function TMyPluginDemo.ConvertToUpperCase(const Value: String): String;
begin
  Result := UpperCase(Value);
end;

...

Хост:

uses
  ..., MyApp.Interfaces;

...

function TMyHostApp.GetPluginUpperCase(Plugin: TjvPlugin; const Value: String): String;
var
  MyPluginInterface: IMyPluginInterface;
begin
  if Supports(Plugin, IMyPluginInterface, MyPluginInterface) then
    Result := MyPluginInterface.ConvertToUpperCase(Value)
  else
    raise Exception.Create('Plugin does not support IMyPluginInterface');
end;

Надеюсь, это поможет.

...