Delphi项目不再通过资源DLL感知DPI

Delphi项目不再通过资源DLL感知DPI,delphi,highdpi,resource-dll,Delphi,Highdpi,Resource Dll,我们有一个德尔福项目,这是DPI意识。我们通过在可执行文件中包含清单实现了这一点。这一切都很好,项目可以根据DPI设置很好地扩展 最近我们开始翻译我们的产品,为此我们使用了Sisulizer。此工具已配置为生成资源DLL。Sisulizer会将清单复制到资源DLL中,但不会进行转换。因此,翻译工作也很好:) 然而,翻译后的项目不再完全了解新闻部。MessageBox(来自Windows API)仍然支持DPI,但项目的其余部分不再扩展。未翻译的项目仍能识别DPI。问题已解决。清单不是问题所在,它

我们有一个德尔福项目,这是DPI意识。我们通过在可执行文件中包含清单实现了这一点。这一切都很好,项目可以根据DPI设置很好地扩展

最近我们开始翻译我们的产品,为此我们使用了Sisulizer。此工具已配置为生成资源DLL。Sisulizer会将清单复制到资源DLL中,但不会进行转换。因此,翻译工作也很好:)


然而,翻译后的项目不再完全了解新闻部。MessageBox(来自Windows API)仍然支持DPI,但项目的其余部分不再扩展。未翻译的项目仍能识别DPI。

问题已解决。清单不是问题所在,它是Sisulizer项目中的一个选项:“Form scaling”被设置为“Disable scaling”,这导致在资源DLL中更改dfm(“Scaled=False”被添加)。将其更改为“忽略”解决了该问题


从GUI更改语言时(so Screen.FormCount>0),缩放未自动设置为正确的DPI。或者换句话说:表单在其设计时状态下从资源DLL流式传输。我们通过在切换到另一种语言之前记录每种形式的比例因子来解决这个问题。一旦更改了语言(并且所有表单都已翻译),我们将对表单重新应用比例因子,以便所有内容都按预期显示。

清单是否仍在EXE的资源中?还是从EXE中删除并移动到DLL中?另外,确保清单的资源ID在EXE的资源中为1,在DLL的资源中为2。加载程序不会激活DLL中的清单。你必须这么做。谢谢你,雷米!清单同时位于EXE和DLL中。我试图更改DLL中的资源ID,但没有改变行为。@David:谢谢你的评论!这确实可以解释很多。关于如何从Delphi实现这一点,您有什么建议吗?您使用的是激活上下文API<代码>激活eACTCTX和朋友。对您有利的一点是,加载DLL时,加载的确实会在调用DllMain时激活与DLL清单关联的上下文,因此您可以使用
GetCurrentActCtx
在那里捕获它。