【问题标题】:Winapi CreateDC hangs on Win 8Winapi CreateDC 在 Win 8 上挂起
【发布时间】:2019-08-24 00:51:20
【问题描述】:

我有一个使用 winapi 函数的程序。当它在 WinXP(32 位)或 Win7(64 位)上运行时,一切正常。但是在Win8(64位)上有个bug:有时程序会在这行代码挂起

HDC hDisplay = CreateDC("DISPLAY", NULL, NULL, NULL);

这可能是什么原因?

附言它是在 WinXP 32 位平台 Win32 的 MSVC 2005 中构建的。

【问题讨论】:

  • 挂起?就像完全停止执行一样?您是否尝试过使用调试器并单步执行代码?
  • 另外,代码很可疑,因为您使用的是窄字符串文字。即使在 Windows XP 时代,一切都是 Unicode。您应该使用L"DISPLAY"(或至少一个自动处理转换的宏,例如TEXT("DISPLAY"))。
  • 问题可能出在其他地方,并且仅在该行上表现出来。试试我也会说的调试器...
  • 在这里工作正常。除非你给一个repro,否则很难解决。
  • 这是一个环境问题。视频驱动程序是主要嫌疑人。对于新的 Windows 版本来说并不罕见。

标签: winapi visual-c++ windows-8


【解决方案1】:

试试:

CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL)

【讨论】:

  • 如果这是问题所在,他应该得到一个关于不匹配字符串文字的编译时错误。他必须通过一个明确的演员来强制代码通过,他奇怪地从问题中省略了。但是,我同意他应该在任何地方都使用 Unicode,即使这不能解释问题。
【解决方案2】:

我已经设法为 64 位平台重建程序,它现在可以工作了。

【讨论】:

  • 这不能回答你提出的问题
【解决方案3】:

虽然这个问题很老了,但我们今天遇到了类似的问题。

我们有代码尝试以这种方式查询打印机:

hdc = CreateDC(pi->pDriverName, pi->pPrinterName, pi->pPortName, NULL);

其中piPRINTER_INFO_2 结构(https://docs.microsoft.com/en-us/windows/win32/printdocs/printer-info-2)。

在我们的 Server 2012R2 机器上安装 Microsoft KB4517298 (https://support.microsoft.com/en-us/help/4517298/windows-8-1-update-kb4517298) 后,这条线似乎无缘无故挂起。以 64 位重建应用程序似乎可以修复它,就像它为原始海报所做的那样。但是,我们仍然不知道为什么会发生这种情况。删除修补程序可以解决问题,然后重新应用它会再次导致问题。

我们正在与我们的供应商合作,看看我们是否可以了解为什么最近的 Windows 更新会破坏我们(以及如何更好地修复它!)。

【讨论】:

  • 类似的问题没有在已知问题下列出。您应该向 Microsoft 提交代码:support.microsoft.com/en-us/help/4020188/…
  • @vbguyny 我们向他们开了一个支持案例。根本原因是 KB4517298 如果在没有任何先前安全汇总的情况下独立安装会引入与 LPC(本地过程调用)的竞争条件,可以通过打开 32 位版本的记事本并尝试打印来重现该问题。
  • 来自 Microsoft Premier Support:“所有更新都应该是累积的。因此,KB4517298 和 KB4512489 应该是 KB4507457 的超集,但由于打包问题,它们不是。Splwow64.exe已在 KB4507457 和 KB4507448 中更新,因此安装除 KB4517298 和 KB4512489 之外的任何 KB 或更新版本的 KB 将安装更新的 splwow64.exe。运行 Window Update 还应安装列表中缺少的更新以解决问题。"
猜你喜欢
  • 1970-01-01
  • 2013-06-23
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-25
  • 2013-09-09
相关资源
最近更新 更多