2015-12-15 1 views
1

У меня есть восемь разных принтеров, установленных на компьютере под управлением Windows 8.1. Эти принтеры - это различные производители и модели, есть два принтера HP LaserJet, струйный принтер Epson, CutePDF Writer, принтер для факса Windows и другие.Как получить производителя и модель принтера от Win32 API?

Для всех моих принтеров этот вызов DeviceCapabilities возвращает -1, что означает «либо, что функция не поддерживается, либо произошел сбой общей функции». Другие fwCapability значения, такие как DC_DUPLEX, успешный.

DeviceCapabilities(pDevice, pPort, DC_MANUFACTURER, NULL, &devMode); 

Я думаю, что DC_MANUFACTURER и DC_MODEL являются «новыми» и поэтому неосуществленными. CUPS имеет атрибут printer-make-and-model, необходимые параметры PPD Manufacturer и Model.

Каков правильный способ запроса производителя и модели принтера с Win32?

+0

Вам конкретно нужны марка и модель, или с вами все в порядке с извлечением той же строки, которую использует диспетчер печати для идентификации принтера? –

+0

Я возьму любую строку, которая идентифицирует, даже грубо говоря, тип принтера. Что ты предлагаешь? –

+0

'EnumPrinters()' позволяет вам перечислять принтеры и получать информацию о них, включая их имя. Это то, что вы ищете? –

ответ

1

DC_MANUFACTURER и DC_MODEL не указаны в документации MSDN, их не стоит изучать.

pDevice параметр в DeviceCapabilities обычно является именем и моделью принтера. Например, «HP LaserJet 123» Это то же самое на панели управления. Это должно быть все, что вам нужно.

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

int wmain() 
{ 
    DWORD flags = PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS; 
    int level = 2; 
    PRINTER_INFO_2* printerInfo; 
    DWORD memsize, printer_count; 

    EnumPrinters(flags, NULL, level, NULL, 0, &memsize, &printer_count); 
    if (memsize < 1) return 0; 

    BYTE* bytes = new BYTE[memsize]; 
    if (EnumPrinters(flags, NULL, level, bytes, memsize, &memsize, &printer_count)) 
    { 
     printerInfo = (PRINTER_INFO_2*)bytes; 
     for (UINT i = 0; i < printer_count; i++) 
     { 
      std::wcout << "printer: " << printerInfo->pPrinterName << "\n"; 
      std::wcout << "printerInfo->pDriverName: " << printerInfo->pDriverName << "\n\n"; 
      printerInfo++; 
     } 
    } 
    delete[] bytes; 

    return 0; 
} 

В коде выше, printerInfo->pPrinterName должен соответствовать имя принтера, как показано на панели управления (или pDevice). printerInfo->pDriverName всегда должно быть именем и моделью принтера.

Чтобы получить имя производителя, вы можете пройти DRIVER_INFO_6 и pszMfgName Однако это может быть не очень полезно.

Смежные вопросы