在不可见的 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的主要内容,如果未能解决你的问题,请参考以下文章

Builder模式详解及其在Android开发中的应用

在不可见的网络浏览器对象 C# 中模拟按键

在不丢失 Spring Jackson 配置的情况下设置 WebClient.Builder.exchangeStrategies()

Easymock:如何在不可见的情况下模拟受保护方法的调用

为啥 Prometheus 不会在不可见的指标上引发错误?

Mac 上的 SwiftUI:帮助文本即使在不透明度为零的视图中也始终可见