[FMX]在 QPlugins 中 VCL 宿主使用 FMX DLL 需要手动处理的问题说明

由于众所周知的原因,FMX 的 DLL 在 FreeLibrary 时,会出现 AV 异常,这实际上包含了两方面的原因:

  1.  FreeLibrary 时,未正确清理内部的计时器,造成 FreeLibrary 后,内部的计时器到指定的时间点后仍然运行,结果就出现了 AV 错误。
  2.  GDI+ 初始化和清理只能在宿主程序中执行(微软的要求),而宿主程序没有引用 winapi.GDIPObj。
  3.  FMX.Canvas.D2D 中的 TCustomCanvasD2D 类型释放时,释放 FShareDevice 接口时,会出异常,造成 AV 错误,而这个错误官方并没有处理,也可能是没空找到它。

既然原因明确了,修该方法也就明确了:

  1.  这个当你引用 qplugins_fmx_messages 时,它已经帮你处理完了,不需要你手工处理了。当然手工修正 FMX.Platform.Win 也是可以的,两者并不会冲突。
  2.  在主程序中引用下 winapi.GDIPObj 单元,然后就没别的事了,这个是解决在 XP 上的问题。
  3.  复制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 的相关处理,在此不再缀述。

分享到: