CreateDC () завершается с lasterror 2 - PullRequest
1 голос
/ 14 октября 2011

Я реализовал класс, который получает локальные принтеры и, в зависимости от опции приложения, использует один из доступных локальных принтеров.

Во-первых, класс перечисляет принтеры (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 обрабатывает правильно. Кроме того, при переустановке системы и приложения проблема иногда исчезает.

Я с нетерпением жду любых предложений, которые помогут мне выяснить проблему.

Заранее спасибо.

1 Ответ

0 голосов
/ 15 октября 2011

Звучит как проблема с загрузкой файла, требуемого драйвером принтера.Вы можете использовать Process Monitor (бесплатный инструмент SysInternals, загружаемый с microsoft.com), чтобы получить кучу информации о том, что происходит во время ошибки.Я бы сделал перехват и посмотрел на неудачные обращения к файлам и реестру.Тот факт, что он периодически дает сбой на одном конкретном компьютере, кажется несовместимым с ошибочной конфигурацией драйвера.

Еще одна вещь, которую вы можете попробовать, - это создать информационный контекст, а не контекст устройства.Вы не можете печатать с помощью IC, но вы можете запросить информацию об устройстве, которая может быть способом получения дополнительной информации.

...