Blog. Just Blog

Как получить список установленных принтеров

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Как получить список установленных принтеров
Как получить список установленных принтеров

Если требуется получить информацию об установленных в системе принтерах, то для этого есть несколько вариантов решения: с помощью PowerShell, WMI или различных языков программирования. У меня, как обычно, будет Ассемблер и WinAPI. Приведенный код получает информацию о всех принтерах в системе, в том числе сетевых.

Для получения интересующей нас информации надо воспользоваться функцией EnumPrinters. Она вызывается в два этапа: сперва определяется объем памяти, необходимый для получения данных, затем эти данные запрашиваются. Список принтеров определяется флагом, это могут быть только локальные принтеры, только сетевые или все доступные печатающие устройства, в том числе и 3D-принтеры. Детализация данных регулируется параметром level, в зависимости от него будет использоваться та или иная структура PRINTER_INFO_x. Вот необходимые константы флатов и структура PRINTER_INFO_2, как наиболее подробная.
  1. PRINTER_ENUM_DEFAULT      = 0x01
  2. PRINTER_ENUM_LOCAL        = 0x02
  3. PRINTER_ENUM_CONNECTIONS  = 0x04
  4. PRINTER_ENUM_NAME         = 0x08
  5. PRINTER_ENUM_REMOTE       = 0x10
  6. PRINTER_ENUM_SHARED       = 0x20
  7. PRINTER_ENUM_NETWORK      = 0x40
  8. PRINTER_ENUM_CATEGORY_3D  = 0x04000000
  9. PRINTER_ENUM_CATEGORY_ALL = 0x02000000
  10.  
  11. struct PRINTER_INFO_2
  12.         pServerName         dd ?
  13.         pPrinterName        dd ?
  14.         pShareName          dd ?
  15.         pPortName           dd ?
  16.         pDriverName         dd ?
  17.         pComment            dd ?
  18.         pLocation           dd ?
  19.         pDevMode            dd ?
  20.         pSepFile            dd ?
  21.         pPrintProcessor     dd ?
  22.         pDatatype           dd ?
  23.         pParameters         dd ?
  24.         pSecurityDescriptor dd ?
  25.         Attributes          dd ?
  26.         Priority            dd ?
  27.         DefaultPriority     dd ?
  28.         StartTime           dd ?
  29.         UntilTime           dd ?
  30.         Status              dd ?
  31.         cJobs               dd ?
  32.         AveragePPM          dd ?
  33. ends
После успешного получения данных о принтерах, выделенная память будет заполнена последовательностью структур нужного формата. Количество этих структур будет записано в переменную dCount:
  1.         ; Получить размер памяти для данных
  2.         mov     [dNeeded],0
  3.         invoke  EnumPrinters,PRINTER_ENUM_LOCAL,NULL,2,\
  4.                 NULL,[dNeeded],dNeeded,dCount
  5.  
  6.         ; Хоть один принтер подключен?
  7.         cmp     [dNeeded],0
  8.         je      no_printers
  9.  
  10.         ; Выделить память и записать в нее данные
  11.         invoke  GlobalAlloc,GMEM_FIXED+GMEM_ZEROINIT,[dNeeded]
  12.         mov     [hMem],eax
  13.         invoke  GlobalLock,[hMem]
  14.         mov     [pMem],eax
  15.  
  16.         ; Получить данные о принтерах
  17.         invoke  EnumPrinters,PRINTER_ENUM_LOCAL,NULL,2,\
  18.                 [pMem],[dNeeded],dNeeded,dCount
  19.  
  20.         ; Указатель на структуры
  21.         mov     esi,[pMem]
  22.         ; Количество установленных принтеров
  23.         mov     ebx,[dCount]
  24. loc_loop:
  25.         ...
  26.         ; ESI -> указатель на очередную структуру PRINTER_INFO_2
  27.         ...
  28.  
  29.         ; Следующая запись
  30.         add     esi,sizeof.PRINTER_INFO_2
  31.         dec     ebx
  32.         or      ebx,ebx
  33.         jnz     loc_loop
  34.  
  35.         ; Освободить память
  36.         invoke  GlobalUnlock,[hMem]
В приложении пример программы с исходным текстом, которая выводит на экран информацию о всех установленных в системе принтеров.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Printers.Info.Demo.zip (3,268 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 475 | Комментариев: 2

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ManHunter (26.05.2023 в 19:48):
На Win7 у меня показывает все установленные принтеры.
avp1965 (26.05.2023 в 18:22):
Только о подключенных принтерах....хотя, это может-быть "заскок" W11.

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.06 сек. / MySQL: 2 (0.0039 сек.) / Память: 4.5 Mb
Наверх