3

imは現在、dllライブラリを使用してプラグインを実装する単純なプログラムで作業しています(JVCLフレームワークのTJvPluginManagerを使用)。

これまでのところ、このコンポーネントを使用してコマンドを処理する方法を理解していますが、ライブラリ内のカスタム関数からの戻り値が必要な場合はどうなりますか?TJvPluginManagerを使用して、ホストから特定の関数を呼び出すことは可能ですか?これをどのように実装すればよいですか?

穴のアイデアは、各dll内に文字列を返す関数を用意して、単純なcicleを使用して呼び出すことができるようにすることです。これは(動的ロードを使用して)手動で実行できると思いますが、可能な限りTJvPluginManagerを使用したいと思います。

お時間をいただきありがとうございます。ジョン・マルコ

4

1 に答える 1

6

私が行う方法は、プラグインにインターフェイスを実装し、ホストから呼び出すことです。

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;

お役に立てれば。

于 2010-11-25T12:40:14.323 に答える