2010-11-25 50 views
3

當前正在使用一個簡單的程序來實現插件(使用JVCL框架中的TJvPluginManager)。使用TJvPluginManager獲得返回值的最佳方法

到目前爲止,我弄清楚如何使用這個組件來處理命令,但是如果我想從庫中的自定義函數返回值呢?通過使用TJvPluginManager從主機調用某個函數是可行的嗎?我應該如何實現這一點?

這個洞的想法是有一個函數返回一個字符串在每個dll內,因此它可以通過使用簡單的cicle調用。我想我可以手工做(使用動態加載),但我想盡可能使用TJvPluginManager。

謝謝你的時間。 John Marko

回答

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; 

希望這有助於。

+0

+1。我正準備以相同的答案作出迴應,但你卻擊敗了我。 – 2010-11-25 12:45:55

相關問題