由于众所周知的原因,FMX 的 DLL 在 FreeLibrary 时,会出现 AV 异常,这实际上包含了两方面的原因:
- FreeLibrary 时,未正确清理内部的计时器,造成 FreeLibrary 后,内部的计时器到指定的时间点后仍然运行,结果就出现了 AV 错误。
- GDI+ 初始化和清理只能在宿主程序中执行(微软的要求),而宿主程序没有引用 winapi.GDIPObj。
- FMX.Canvas.D2D 中的 TCustomCanvasD2D 类型释放时,释放 FShareDevice 接口时,会出异常,造成 AV 错误,而这个错误官方并没有处理,也可能是没空找到它。
既然原因明确了,修该方法也就明确了:
- 这个当你引用 qplugins_fmx_messages 时,它已经帮你处理完了,不需要你手工处理了。当然手工修正 FMX.Platform.Win 也是可以的,两者并不会冲突。
- 在主程序中引用下 winapi.GDIPObj 单元,然后就没别的事了,这个是解决在 XP 上的问题。
- 复制FMX.Platform.Win 和 FMX.Canvas.D2D 到你的工程目录,然后为 TCustomCanvasD2D 添加类的析构方法(注意不是TCustomCanvasD2D的析构函数,是 class destructor),实现代码如下:
class destructor TCustomCanvasD2D.Destroy; begin inherited; try DestroySharedResources; except end; end;
FMX.Platform.Win 单元到你的工程目录下,不需要做任何变动,当然如果你做过其它修正,也没问题,然后就可以按照正常的FMX 程序在DLL中使用了。之所以要复制它,是因为我们修改了 FMX.Canvas.D2D 的接口部分,这就需要重新编译依赖于它的单元,而 FMX.Platform.Win 恰恰使用了它。
【额外说明】
如果您不是 QPlugins 的用户,请手动处理下 FMX.Platform.Win,在做修订时,你参考 [FMX]FMX 编写 Windows 平台下 DLL 需要解决的两个问题 外,你还需要处理 FMX Application 和宿主的两个 Application 应用窗口造成双任务栏的问题。具体可以参考 QPlugins 的相关处理,在此不再缀述。