You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于FMX TCameraComponent的摄像头DLL实现正确性排查及兼容问题

排查思路与解决方案

一、FMX与VCL跨框架兼容性问题

  • FMX的TCameraComponent依赖自身UI框架和消息循环,和VCL应用的消息循环机制存在差异,在Win11触摸平板上容易引发冲突:
    • 必须在DLL内部启动独立线程托管FMX摄像头窗体,线程内调用Application.Run处理FMX专属消息,避免和VCL主消息循环抢占资源。
    • 强制在DLL入口函数中执行FMX.Forms.Initialize初始化FMX资源,退出时调用FMX.Forms.Finalize清理,不要依赖调用端的框架初始化逻辑。

二、Chuwi Win11平板硬件与系统适配问题

  • Win11摄像头权限模型、硬件驱动和Win10存在差异,Chuwi平板可能存在适配缺陷:
    • 确认调用端VCL程序已获得系统摄像头权限:进入系统「隐私和安全性」→「相机」,开启桌面应用的摄像头访问权限。
    • 用Win原生MediaCapture API写最小测试程序,验证平板摄像头本身是否能正常工作,排除FMX组件对特定硬件的适配盲区。
    • 更新Chuwi平板的摄像头驱动至厂商最新版本,Win11对部分老硬件的驱动兼容性需要厂商针对性优化。

三、DLL加载/释放异常问题

  • WinAPI的LoadLibrary/FreeLibrary和Delphi常规加载方式的核心差异是RTL初始化逻辑:
    • 禁止在DllMain中执行耗时操作(比如初始化摄像头组件),DllMain运行在加载线程中,易引发死锁或资源初始化不完整,把组件初始化逻辑移到单独的导出函数中。
    • 确保DLL和调用端使用完全一致的RTL版本(均为Delphi 12编译),内存管理器设置统一:若用动态RTL,调用端也必须启用动态RTL;若用静态RTL,禁止跨模块进行内存分配/释放操作。
    • 改用LoadLibraryEx加载DLL,指定LOAD_WITH_ALTERED_SEARCH_PATH参数,确保DLL能正确加载FMX依赖库(如FMX.Controls.Win),避免Chuwi平板上因库路径查找失败导致初始化异常。

四、代码实现重点检查项

针对你提供的DLL窗体、项目及调用端代码,优先核查:

  • DLL项目设置:确认目标平台与平板系统位数匹配(如64位),动态RTL选项与调用端保持一致。
  • 摄像头初始化逻辑:TCameraComponent.Active属性的设置放在异步线程中,避免阻塞主线程;启用OnError事件捕获具体错误(如设备不存在、权限被拒)。
  • 窗体生命周期:DLL中创建的FMX窗体必须在释放DLL前彻底销毁,禁止保留全局FMX组件实例,遵循「调用时创建、用完即销毁」的原则。
  • 调用端释放逻辑:使用LoadLibrary加载时,调用FreeLibrary前必须确保所有DLL创建的窗体、线程、组件已完全清理,无残留FMX消息循环。

内容的提问来源于stack exchange,提问作者Pier Nardin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 19:22:14