在不可见的 C++Builder 应用程序中使用 ActiveX
Posted
技术标签:
【中文标题】在不可见的 C++Builder 应用程序中使用 ActiveX【英文标题】:Use ActiveX in invisible C++Builder application 【发布时间】:2021-08-23 17:20:09 【问题描述】:我正在开发一个使用 ActiveX 控件执行一些后台工作的 C++Builder 应用程序。如果我明显地运行该应用程序,它工作正常。但是当我不可见地运行它时(通过在启动期间设置Application->ShowMainForm = false
来完成),ActiveX 控件的行为就不一样了。立即返回的 ActiveX 方法工作正常,但执行后台工作的方法不起作用,没有任何进展。
当应用程序不可见时,如何使 ActiveX 控件正常运行,并让它们执行后台任务?
作为测试,我在 Visual Studio 中创建了一个小型 C# .NET 项目,并且相同的 ActiveX 控件在不可见模式下可以正常工作(但在 C++Builder 中不行)。
【问题讨论】:
Application->ShowMainForm = false
并没有什么特别之处,它只是在调用Application->Run()
时隐藏了MainForm
使其不会出现在屏幕上。 MainForm
窗口仍然存在,主消息循环仍在运行。因此,您的 ActiveX 控件没有理由不工作,除非它需要一个非隐藏的父窗口。但是在类似的情况下,您的 C# 测试会失败。所以肯定有另一个你没有描述的因素在起作用。
如果我不得不猜测,你的MainForm
可能根本没有创建它的HWND
,因为你没有在视觉上显示它。尝试在Application->Run()
之前调用Application->MainForm->HandleNeeded()
。或者,摆脱Application->ShowMainForm = false
而是将MainForm
设置为最小化自身。或者,只需将 MainForm
移出屏幕即可。
在我的情况下证明不需要在表单上调用HandleNeeded()
,但在控件本身上调用它可以解决问题。
【参考方案1】:
在表单构造函数中对 ActiveX 控件调用 HandleNeeded() 解决了该问题。
TForm1::TForm1()
control1->HandleNeeded();
显然,一些ActiveX控件需要一个窗口句柄才能正常工作,而这个句柄在隐藏时不会自动创建。
【讨论】:
以上是关于在不可见的 C++Builder 应用程序中使用 ActiveX的主要内容,如果未能解决你的问题,请参考以下文章
在不丢失 Spring Jackson 配置的情况下设置 WebClient.Builder.exchangeStrategies()