【问题标题】:SetProcessDpiAwareness error codeSetProcessDpiAwareness 错误代码
【发布时间】:2016-05-11 16:30:22
【问题描述】:

我首先在我的 Delphi XE7 应用程序中添加了对 SetProcessDpiAwareness windows 函数的调用(在动态加载 shcore DLL 之后)。我知道最好使用清单来设置 DPIAware 值,我已经将它单独工作并最终会使用它。但是在开发过程中我想使用命令行参数来设置 DPIAwareness 值,否则我必须重新构建应用程序才能更改此状态。

问题在于 SetProcessDpiAwareness 返回错误代码 $800700A0。 功能描述中没有记录,代码是什么意思?

啊我找到了,感谢看参数的答案,我已经声明了函数类型错误,我有:

TSetDPIFunc = 函数 (const PROCESS_DPI_AWARENESS) : HRESULT;标准调用;

但 PROCESS_DPI_AWARENESS 未定义为枚举。 更改为以下内容,现在可以正常工作了:

TSetDPIFunc = 函数 (const x: Integer) : HRESULT;标准调用;

【问题讨论】:

  • 你打电话给SetProcessDPIAwareness还是SetProcessDPIAware?标题暗示了前者。后者不返回任何错误代码,非零返回意味着函数已成功。请编辑问题以清除。
  • 如果您确实调用了 SetProcessDPIAwareNESS,请告诉我们您使用哪个参数调用它!
  • 函数是SetProcessDpiAwareness,对不起原帖中的错字。

标签: windows delphi dpi


【解决方案1】:

0x8007XXXX 是使用HRESULT_FROM_WIN32()Win32 error code encapsulated in a COM HRESULTWIN32_FROM_HRESULT(0x800700A0) 给出0xA0,即错误代码160,即ERROR_BAD_ARGUMENTS(“一个或多个输入参数不正确”)。

虽然你得到这个错误对我来说毫无意义,因为这个函数甚至不接受任何参数

所以我唯一能想到的就是它与the issue described here 有关,假设您自己更改了 DPI 设置以进行测试,然后它失败了:

因此看来,为了使 SetProcessDPIAware(以及相关方法:SetProcessDpiAwareness() 和 manifest 为 true)正常工作,必须在更改 DPI 设置后和运行程序之前注销并再次登录。

顺便说一句,如果这有帮助:对于在不完全重建的情况下测试清单,您可以使用 mt.exe 从命令行将清单附加到您的应用程序。

【讨论】:

  • 您还可以将清单内容保存到与可执行文件位于同一文件夹中的单独.manifest 文件中,而不是将其编译为资源。例如,如果您的应用程序的可执行文件名为 MyApp.exe,请将清单保存到 MyApp.exe.manifest。然后,您可以在运行之间根据需要简单地编辑文件。
  • 仅当您没有嵌入清单时,这可能是编译器的默认设置(因为微软也鼓励这样做)。从 Windows Vista 开始,如果存在嵌入式清单,外部清单将被忽略。
  • 您可以在项目选项中关闭默认的嵌入式清单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多