0

我们有一个用 Delphi 7 编写的 COM 服务器 DLL,它可以从用 XE2 编写的 VCL 应用程序中使用。

在分辨率为 3000x2000 的 Microsoft Surface Book 上,XE2 应用程序启动正常并正常缩放,但是当用户单击导致使用 COM DLL 的选项时,主窗体突然缩小到一半大小,同时文本和控件。

我们有一个相关的 Delphi 7 VCL 应用程序有同样的问题,但我们现在包含一个自定义清单,明确指出 DPIAware 是错误的。这在 Surface Book 上运行良好。我们在 COM DLL 上尝试了相同的技术,但没有效果。

如果我们有首选外部清单的注册表值并在 XE2 应用程序中包含一个清单文件,我们可以使用我们的 Delphi 7 COM DLL 使 XE2 程序正确扩展。但是,它还使用 WinExec 从内部执行另一个 XE2 应用程序,然后这个第二个 XE2 应用程序的扩展性很差。包含第二个 XE2 应用程序的清单无效,除非直接运行而不是从第一个 XE2 应用程序内运行。

奇怪的是,如果我们在 XE2 中构建一个 COM 服务器,它总是在高 DPI 情况下正确扩展,即使没有自定义清单,所以我们目前正在尝试将 Delphi 7 DLL 转换为 XE2,但它有很多工作许多旧版组件包不再适用于 XE2。

请注意,一旦为 COM 服务器调用 CoCreate,XE2 应用程序就会缩小。当 COM 服务器被释放时,它不会缩回到原来的大小。

有没有人知道如何让 Delphi 7 DLL 向 Windows 报告它不支持 DPI,以便使用它的其他不支持 DPI 的应用程序不会突然不正确地缩放?

4

1 回答 1

0

我对 VB6 Exe 和 .Net Com Interop Dll 有类似的问题(两者都不知道 DPI)。在具有高 DPI 设置的显示器上,窗口大小突然发生了变化。
此解决方法解决了它:我设置了 exe 的兼容性设置“在高 DPI 设置上禁用显示缩放”。

于 2016-09-29T14:27:16.947 回答