2010-11-25 8 views
3

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

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

ホールアイデアは、各dllの中に文字列を返す関数を持つことで、単純なcicleを使用して呼び出すことができます。私は手で(ディナミックローディングを使用して)これを行うことができると思うが、できるだけTJvPluginManagerを使って作業したい。

ありがとうございます。 John Marko

答えて

6

私がやる方法は、プラグインにInterfaceを実装し、ホストから呼び出すことです。

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; 

は、この情報がお役に立てば幸いです。

+0

+1。私は同じ答えを返そうとしていましたが、あなたは私にそれを打ち負かしました。 –

関連する問題