Как получить список установленных принтеров
Как получить список установленных принтеров
Если требуется получить информацию об установленных в системе принтерах, то для этого есть несколько вариантов решения: с помощью PowerShell, WMI или различных языков программирования. У меня, как обычно, будет Ассемблер и WinAPI. Приведенный код получает информацию о всех принтерах в системе, в том числе сетевых.
Для получения интересующей нас информации надо воспользоваться функцией EnumPrinters. Она вызывается в два этапа: сперва определяется объем памяти, необходимый для получения данных, затем эти данные запрашиваются. Список принтеров определяется флагом, это могут быть только локальные принтеры, только сетевые или все доступные печатающие устройства, в том числе и 3D-принтеры. Детализация данных регулируется параметром level, в зависимости от него будет использоваться та или иная структура PRINTER_INFO_x. Вот необходимые константы флатов и структура PRINTER_INFO_2, как наиболее подробная.
Code (Assembler) : Убрать нумерацию
- PRINTER_ENUM_DEFAULT = 0x01
- PRINTER_ENUM_LOCAL = 0x02
- PRINTER_ENUM_CONNECTIONS = 0x04
- PRINTER_ENUM_NAME = 0x08
- PRINTER_ENUM_REMOTE = 0x10
- PRINTER_ENUM_SHARED = 0x20
- PRINTER_ENUM_NETWORK = 0x40
- PRINTER_ENUM_CATEGORY_3D = 0x04000000
- PRINTER_ENUM_CATEGORY_ALL = 0x02000000
- struct PRINTER_INFO_2
- pServerName dd ?
- pPrinterName dd ?
- pShareName dd ?
- pPortName dd ?
- pDriverName dd ?
- pComment dd ?
- pLocation dd ?
- pDevMode dd ?
- pSepFile dd ?
- pPrintProcessor dd ?
- pDatatype dd ?
- pParameters dd ?
- pSecurityDescriptor dd ?
- Attributes dd ?
- Priority dd ?
- DefaultPriority dd ?
- StartTime dd ?
- UntilTime dd ?
- Status dd ?
- cJobs dd ?
- AveragePPM dd ?
- ends
Code (Assembler) : Убрать нумерацию
- ; Получить размер памяти для данных
- mov [dNeeded],0
- invoke EnumPrinters,PRINTER_ENUM_LOCAL,NULL,2,\
- NULL,[dNeeded],dNeeded,dCount
- ; Хоть один принтер подключен?
- cmp [dNeeded],0
- je no_printers
- ; Выделить память и записать в нее данные
- invoke GlobalAlloc,GMEM_FIXED+GMEM_ZEROINIT,[dNeeded]
- mov [hMem],eax
- invoke GlobalLock,[hMem]
- mov [pMem],eax
- ; Получить данные о принтерах
- invoke EnumPrinters,PRINTER_ENUM_LOCAL,NULL,2,\
- [pMem],[dNeeded],dNeeded,dCount
- ; Указатель на структуры
- mov esi,[pMem]
- ; Количество установленных принтеров
- mov ebx,[dCount]
- loc_loop:
- ...
- ; ESI -> указатель на очередную структуру PRINTER_INFO_2
- ...
- ; Следующая запись
- add esi,sizeof.PRINTER_INFO_2
- dec ebx
- or ebx,ebx
- jnz loc_loop
- ; Освободить память
- invoke GlobalUnlock,[hMem]
Просмотров: 597 | Комментариев: 2
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(26.05.2023 в 19:48):
На Win7 у меня показывает все установленные принтеры.
avp1965
(26.05.2023 в 18:22):
Только о подключенных принтерах....хотя, это может-быть "заскок" W11.
Добавить комментарий
Заполните форму для добавления комментария