升级到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容器类,跳过触摸管理器的创建逻辑:
- 先定义自定义容器类:
class TActiveXContainer : public TForm { protected: // 重写触摸管理器创建方法,不生成FTouchManager实例 virtual void __fastcall CreateTouchManager() override {} public: __fastcall TActiveXContainer(TComponent* Owner) : TForm(Owner) { Visible = false; } };
- 替换原有容器创建逻辑即可:
container = new TActiveXContainer(NULL); softlock = new TCryptoLicense(container); softlock->Parent = container;
如果设计期拖拽组件仍有崩溃,可以在TCryptoLicense组件的构造逻辑开头添加以下代码:
if( ComponentState.Contains(csDesigning) ) { Vcl::Controls::TControl::SetTouchSupportEnabled(false); }
内容的提问来源于stack exchange,提问作者vision
相关产品推荐
相关产品推荐

