【问题标题】:CreateDC() fails with lasterror 2CreateDC() 失败并出现 lasterror 2
【发布时间】:2011-12-07 18:58:24
【问题描述】:

我已经实现了一个获取本地打印机的类,并根据应用程序选项使用可用的本地打印机之一。

首先,该类枚举打印机(EnumPrinters - PRINTER_ENUM_LOCAL)并保存相应的PRINTER_INFO_2。然后,它获得打印机功能 (DeviceCapabilites) 和 DEVMODE。每个类实例将访问一台打印机。

当应用程序选择打印选项时,它会选择要使用的打印机及其对应的类实例。然后,此实例创建设备上下文:

    m_hdc = CreateDC (m_pi2->pDriverName, m_pi2->pPrinterName, NULL, m_pdm));

在哪里

    HDC m_hdc;
    PRINTER_INFO_2 * m_pi2;
    DEVMODE * m_pdm;

并相应地处理所有打印数据。

问题在于,有时 CreateDC 返回 NULL 并且 GetLastError() 返回 ERROR_FILE_NOT_FOUND(2)。

我的意思是“有时”,因为在其他机器上,使用相同的打印机、相同的处理器、相同的 Windows XP SP3 映像和相同的测试数据,CreateDC 可以正确处理。另外,重装系统和应用程序问题消失有时不会。

我期待听到任何有助于我找出问题的建议。

提前谢谢你。

【问题讨论】:

  • 根据我的经验,GetLastError() 不会从 CreateDC()(或大多数 GDI 函数)返回可靠信息。我不会在错误实际上是 2 中投入太多。
  • @HansPassant:为什么要更新打印机驱动程序来解决这个问题?

标签: windows winapi printing gdi


【解决方案1】:

这听起来像是加载打印机驱动程序所需的文件时出现问题。您可以使用 Process Monitor(可从 microsoft.com 下载的免费 SysInternals 工具)来获取有关错误发生时发生的情况的大量信息。我会进行捕获并查看失败的文件和注册表访问。它在一台特定机器上间歇性失败的事实似乎与混乱的驱动程序配置一致。

您可以尝试的另一件事是创建信息上下文而不是设备上下文。不能用 IC 打印,但可以查询设备信息,这可能是获取更多信息的一种方式。

【讨论】:

  • 我非常怀疑缺少文件会导致这种情况,但测试起来很简单。打开任何应用程序(记事本就可以)并打印一些东西。如果它打印,驱动程序很好,问题出在 OP 的代码中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
  • 2022-07-15
  • 2018-02-24
  • 1970-01-01
  • 2017-11-01
相关资源
最近更新 更多