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

升级到C++Builder 11后创建ActiveX控件触发访问冲突如何解决?

问题根因

C++Builder 11.0版本重构了VCL的触摸管理器实现逻辑,TControl构造阶段会默认创建FTouchManager实例,但ActiveX控件寄宿到VCL容器的过程中,会提前触发TControl的部分生命周期校验逻辑,此时FTouchManager尚未完成初始化就被访问,最终引发访问冲突。10.4版本无该触摸逻辑改动,因此运行正常。

解决方案

方案1:全局禁用触摸支持(改法最简单,适配绝大多数桌面应用场景)

如果你的应用不需要适配触摸交互,直接在工程入口文件(通常是[项目名].cpp)的Application->Initialize调用后添加一行全局配置,即可完全避开触摸管理器的初始化逻辑,同时解决运行期、设计期的崩溃问题:

Application->Initialize();
// 新增下面这行
Vcl::Controls::TControl::SetTouchSupportEnabled(false);
// 原有后续逻辑
Application->CreateForm(__classid(TForm1), &Form1);
// ...

无需修改原有业务代码,全量重新编译工程即可生效。

方案2:自定义容器类规避触摸逻辑(适合需要保留全局触摸支持的场景)

如果需要保留应用全局的触摸交互能力,可以重写ActiveX容器类,跳过触摸管理器的创建逻辑:

  1. 先定义自定义容器类:
class TActiveXContainer : public TForm
{
protected:
    // 重写触摸管理器创建方法,不生成FTouchManager实例
    virtual void __fastcall CreateTouchManager() override {}
public:
    __fastcall TActiveXContainer(TComponent* Owner) : TForm(Owner)
    {
        Visible = false;
    }
};
  1. 替换原有容器创建逻辑即可:
container = new TActiveXContainer(NULL);
softlock = new TCryptoLicense(container);
softlock->Parent = container;

如果设计期拖拽组件仍有崩溃,可以在TCryptoLicense组件的构造逻辑开头添加以下代码:

if( ComponentState.Contains(csDesigning) ) {
    Vcl::Controls::TControl::SetTouchSupportEnabled(false);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 01:54:04