2010-11-25 70 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

相关问题