【发布时间】: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(),但在控件本身上调用它可以解决问题。
标签: activex c++builder c++builder-10.4-sydney