使用TJvPluginManager获得返回值的最佳方法
问题描述:
当前正在使用一个简单的程序来实现插件(使用JVCL框架中的TJvPluginManager)。使用TJvPluginManager获得返回值的最佳方法
到目前为止,我弄清楚如何使用这个组件来处理命令,但是如果我想从库中的自定义函数返回值呢?通过使用TJvPluginManager从主机调用某个函数是可行的吗?我应该如何实现这一点?
这个洞的想法是有一个函数返回一个字符串在每个dll内,因此它可以通过使用简单的cicle调用。我想我可以手工做(使用动态加载),但我想尽可能使用TJvPluginManager。
谢谢你的时间。 John Marko
答
我这样做的方法是在插件中实现一个接口并从主机调用它,例如,
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;
希望这有助于。
+1。我正准备以相同的答案作出回应,但你却击败了我。 – 2010-11-25 12:45:55