当然 在该单元的 Use 列表中应当将 TFrmTest TFrmTest 以及 TFrmTest 所在的单元包含进来而 TFrmTest 的实现可以象这样 :
TFrmTest = Class(TMyBaseForm)
protected
function GetTitle: PChar; override;
end;
function TFrmTestGetTitle: Pchar;
begin
result := Hello from TFrmTest;
end;
末了 别忘了将 GetClassCount 和 GetClassByIndex 加到 Exports 列表中然后 Build 该 Dll 工程的时候 请将 Project optionpackage 中的 使用运行包 use runtime package 打勾至于具体的原因后面讲
至此 Dll 方面的工作告一段落
第三步 主程序驱动引擎的实现 :
这一步相对来说容易些 无非是动态加载 Dll然后调用 GetClassCount 函数 接着调用 GetClassByIndex 关键的代码 :
Var AClass: TMyBaseClass;
AForm: TMyBaseForm;
I iCount: integer;
blResult: Boolean;
begin
// 略去加载动态库的部分 假定 FPGetClassProc 指向 GetClassCount 函数 FPGetClassByIndexProc 指向 GetClassByIndex则 :
iCount := FPGetClassProc;
for I := to iCount do
begin
AClass := FPGetClassByIndex(I blResult);
if blResult then
begin
AForm := AClassCreate(Application);
AFormCaption := AFormGetTitle;
AFormShow;
end;
end;
// …
end;
注意一点 和 Dll 相似 创建输出文件的时候 也需要选择使用运行时间包这是因为 如果不使用运行时间包 将导致相同的类在内存中有多个副本 因而对它们使用 Is 操作符的将返回 False 的结果
[] [] []