在 DLL 中使用 VCL 样式会导致 10.2 Tokyo 出现系统异常

Using VCL Styles in a DLL causes System Exception in 10.2 Tokyo

最初用 XE2 编写的应用程序在 DLL 中使用样式,因此从 DLL 弹出的表单与 EXE 的样式相同,当更新为在 10.2 Tokyo 中构建时,现在从 EXE 打开某些表单时会导致系统异常,或在 EXE 中关闭某些表单时。

我不需要在这个问题中包含 minimal reproducible example,因为我有一个答案,如果它没有这么快关闭,其他人可能已经能够添加到我的原始问题中,并且那么即使在 on-topic.

之后也不会 re-opened

事实证明这是 VCL 中的行为问题:

Exception if using comboboxes in a form that resides in a DLL and that uses VCLStyles.

Embarcadero 不会修复它,因为它不是 "problem"、

R&D writes that the style manager has to be enabled in the application and there can be only one one TStyleManager with enabled system hooks (TStyleManager.SystemHooks property), because it process all windows from application. The current system doesn't support the scenario you are suggesting, and there is currently no plan to rework it

但有一个解决方法,即在 DLL 代码中调用 SetStyleTrySetStyle 之前立即添加以下代码行:

TStyleManager.SystemHooks := [];

希望这对 Delphi 开发人员在升级到较新版本后 运行 遇到这个烦人的问题有所帮助。

在我的例子中,我为库添加了一个条件定义到项目中,然后将这段代码添加到它设置样式的地方,因为相同的单元包含在 EXE 和 DLL 中:

{$IFDEF DLL}
  TStyleManager.SystemHooks := [];
{$ENDIF}