【发布时间】:2020-09-10 15:50:40
【问题描述】:
我们有一个 DPI 感知的 Delphi 项目。除其他外,我们通过在可执行文件中包含清单来实现这一点。这一切都很好,项目可以根据 DPI 设置很好地缩放。
最近我们开始翻译我们的产品,为此我们使用了 Sisulizer。此工具已配置为生成资源 DLL。清单由 Sisulizer 复制到资源 DLL,但不翻译。所以翻译也很好:)
但是,翻译后的项目不再完全支持 DPI。 MessageBoxes(来自 Windows API)仍然支持 DPI,但项目的其余部分不再可扩展。未翻译的项目仍可识别 DPI。
【问题讨论】:
-
清单是否还在 EXE 的资源中?还是从 EXE 中删除并移至 DLL?此外,请确保清单的资源 ID 在 EXE 的资源中为 1,在 DLL 的资源中为 2。
-
加载程序不会激活 dll 中的清单。你必须这样做。
-
谢谢,雷米!清单在 EXE 和 DLL 中。我尝试更改 DLL 中的资源 ID,但并没有改变行为。
-
@David:感谢您的评论!这确实可以解释很多。您对如何从 Delphi 实现这一点有任何指示吗?
-
您使用激活上下文 API。
ActivateActCtx和朋友们。对您有利的一件事是,当加载 DLL 时,加载的确实会在对 DllMain 的调用中激活与 DLL 清单关联的上下文,因此您可以使用GetCurrentActCtx在此处捕获它。
标签: delphi highdpi resource-dll