Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/64: Рейтинг темы: голосов - 64, средняя оценка - 5.00
2 / 2 / 1
Регистрация: 17.07.2015
Сообщений: 63

Подключенные устройства и их список

28.04.2017, 17:34. Показов 13633. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, форумчане! Необходимо получить список всех подключенных периферийных устройств, которые подключены к компьютеру в текущий момент времени. Необходимо реализовать данный функционал с помощью функций WinAPI.
Находил подобные вопросы с ответами в теме на форуме, но пояснений к тому, что и как используется толком нет. Пробовал по этим же примерам написать код самостоятельно, но это были неудачные попытки. Поэтому решил обратиться за помощью. Не могли бы вы, уважаемые форумчане, помочь мне? Например, какие функции можно использовать и в какой последовательности?
Заранее спасибо!
PS: пишу в VS2015.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.04.2017, 17:34
Ответы с готовыми решениями:

Находить все подключенные к компьютеру USB устройства и на усмотрения пользователя их блокировать.
Началась производственная практика дали задние: Программа должна находить все подключенные к компьютеру USB устройства и на усмотрения...

Подключенные устройства
Всем Привет, Подскажите, через что или как сделать что бы увидеть кто подключился (Высветить список IP кто подключился). Просто...

PC не обнаруживает подключенные устройства при включении
Здравствуйте. Разделом, скорее всего, ошибся, но не бейте. В общем, у меня такая проблема. На компьютере есть кнопка старта и ресета (кэп)....

4
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
28.04.2017, 19:14
Ну я, как обычно, буду советовать Setup API. Начинается он с функции SetupDiGetClassDevs -
это формирование списка устройств. Далее их можно перечислять либо по интерфейсам
(да, разные устройства могут иметь один и тот же интерфейс) - SetupDiEnumDeviceInterfaces,
либо по классам - SetupDiEnumDeviceInfo. На каждом шаге перечисления можно вызывать
функцию SetupDiGetDeviceRegistryProperty, получая разнообразную информацию - имя,
производитель, тип шины, управляющая служба, Hardware ID / Compatible ID и т.д., все
то же самое, что отображает стандартный "диспетчер устройств".

Все эти функции хорошо документированы в MSDN. В качестве хорошего примера их
использования могу порекомендовать исходники утилиты devcon, они есть где-то в
сэмплах Microsoft.
1
2 / 2 / 1
Регистрация: 17.07.2015
Сообщений: 63
29.04.2017, 00:10  [ТС]
Убежденный, спасибо за Ваш ответ! Воспользовался документацией MSDN, но столкнулся со следующей проблемой: когда я хочу получить информацию о каком-либо устройстве, у меня ничего не получается (ошибка 1784 – The supplied user buffer is not valid for the requested operation в функции SetupDiGetDeviceRegistryProperty). Можно узнать, что я делаю не так? Код ниже.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <Windows.h>
#include <SetupAPI.h>
#include <iostream>
#include <conio.h>
 
#pragma comment(lib, "SetupAPI.lib")
 
#define MAX_DEV_LEN 1024
 
int main()
{
    GUID ClassGuid;
 
    HDEVINFO info = SetupDiGetClassDevs(&ClassGuid, 0, 0, DIGCF_ALLCLASSES | DIGCF_PRESENT);
 
    PSP_DEVINFO_DATA data = new SP_DEVINFO_DATA;
    data->cbSize = sizeof(SP_DEVINFO_DATA);
    
    BOOL result = SetupDiEnumDeviceInfo(info, 0, data);
 
    if (result)
    {
        PBYTE output = new BYTE;
 
        PDWORD datatype = new DWORD;
 
        BOOL res = SetupDiGetDeviceRegistryProperty(info, data, SPDRP_CHARACTERISTICS, datatype, 0, MAX_DEV_LEN, 0);
 
        if (!res)
        {
                    int error = GetLastError();
                    std::cout << "Error - " << error << std::endl;
        }
    }
 
    _getch();
 
    SetupDiDestroyDeviceInfoList(info);
    delete data;
    return 0;
}
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
29.04.2017, 09:20
Ты в SetupDiGetDeviceRegistryProperty передаешь 0 в качестве выходного буфера
(5-ый по счету параметр функции). Она же "не знает", куда возвращать данные...
1
2 / 2 / 1
Регистрация: 17.07.2015
Сообщений: 63
29.04.2017, 10:12  [ТС]
Убежденный, с данной ошибкой разобрался. Возникла другая проблема : в цикле вызываю SetupDiEnumDeviceInfo, затем SetupDiGetDeviceRegistryProperty. Если в SetupDiGetDeviceRegistryProperty третьим параметром стоит SPDRP_FRIENDLYNAME, то везде выдает ошибку 13, говорящую о том, что свойство недоступно.

В чем проблема, неужели у всех устройств данное свойство недоступно?

И еще возник вопрос: правильно ли я понимаю, что сейчас я вывожу все устройства системы, независимо от их класса? Если да, то можно ли как-нибудь выводить информацию об устройствах определенного класса?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <Windows.h>
#include <SetupAPI.h>
#include <iostream>
#include <fstream>
#include <conio.h>
#include <string>
 
#pragma comment(lib, "SetupAPI.lib")
 
#define MAX_DEV_LEN 128
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    std::ofstream file;
    file.open("tests.txt");
 
    GUID ClassGuid;
 
    HDEVINFO info = SetupDiGetClassDevs(&ClassGuid, 0, 0, DIGCF_ALLCLASSES | DIGCF_PRESENT);
 
    PSP_DEVINFO_DATA data = new SP_DEVINFO_DATA();
    data->cbSize = sizeof(SP_DEVINFO_DATA);
    
    PBYTE output = new BYTE[MAX_DEV_LEN];
    PDWORD datatype = new DWORD;
    PDWORD RequiredSize = new DWORD;
    BOOL result = TRUE;
    DWORD i = 0;
 
    while(result)
    {
        result = SetupDiEnumDeviceInfo(info, i, data);
 
        if (result)
        {
            BOOL res = SetupDiGetDeviceRegistryProperty(info, data, SPDRP_CLASS, datatype, output, MAX_DEV_LEN, RequiredSize);
 
            file << "Iteration #" << i << std::endl;
 
            if (!res)
            {
                int error = GetLastError();
                file << "Error - " << error << std::endl;
            }
            else
            {
                file << output << std::endl;
            }
 
            res = SetupDiGetDeviceRegistryProperty(info, data, SPDRP_DEVICEDESC, datatype, output, MAX_DEV_LEN, RequiredSize);
 
            if (!res)
            {
                int error = GetLastError();
                file << "Error - " << error << std::endl;
            }
            else
            {
                file << output << std::endl;
            }
 
            res = SetupDiGetDeviceRegistryProperty(info, data, SPDRP_FRIENDLYNAME, datatype, output, MAX_DEV_LEN, RequiredSize);
 
            if (!res)
            {
                int error = GetLastError();
                file << "Error - " << error << std::endl;
            }
            else
            {
                file << output << std::endl;
            }
        }
        else
        {
            file << "SetupDiEnumDeviceInfo error\n";
        }
 
        file << std::endl;
 
        ++i;
    }
 
    file.close();
 
    SetupDiDestroyDeviceInfoList(info);
    
    delete datatype;
    delete RequiredSize;
    delete data;
    delete[] output;
 
    return 0;
}
UPDATE: не заметил вовремя Вашего ответа по поводу буфера, но все равно большое спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.04.2017, 10:12
Помогаю со студенческими работами здесь

Никакие устройства, подключенные в USB, не видно!
Перепрбовал всё!!! В дспетчере утр. всё нормально... в bios всё нормально... тестером мерял, нормально... В usb вставлял всё что было: и...

Cisco 2960 отвалились подключенные устройства
Схема участка сети: Роутер -- Fa0/22 (2960) Gi0/2 -- свич Dlink (7 устройств) Кошка работает под: Cisco IOS Software,...

Отобразить через MMC-оснастку все подключенные устройства
дали задание, отобразить через оснастку все подключенные устройства (диспетчер устройств не подходит) к примеру : вкл вай-фай или бт....

Ноут иногда не распознаёт устройства, подключенные через usb hub
Заказал недавно usb hub для ноутбука Xiaomi Gaming Laptop. Работает, в целом, нормально, но есть небольшой косяк. Иногда (после долго...

Что видит провайдер?, или как скрыть устройства подключенные к сети
В общем ситуация такая: Приятелю приходит интернет от провайдера. Если я правильно понял - инет идёт через VPN-сервер. (абоненты в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru