Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/29: Рейтинг темы: голосов - 29, средняя оценка - 4.72
6 / 5 / 3
Регистрация: 04.06.2015
Сообщений: 250
Записей в блоге: 1

Как получить номер USB-порта, на котором "сидит" подключенное устройство

12.04.2016, 23:36. Показов 6618. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток, уважаемые коллеги!
Заранее прошу прощения у модераторов, если моя тема не совсем соответствует данному разделу, просто я так и не определился к какому разделу её корректнее будет отнести. Выбрал этот, т.к. мой проект всё-таки на C++/CLI Windows Forms.
А теперь по сути. Вот фрагмент моего кода:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <windows.h> 
#include <setupapi.h>
#include <Dbt.h>
#include <string.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
 
#pragma comment(lib,"setupapi.lib")
#pragma comment(lib,"advapi32.lib")
#pragma comment(lib,"user32.lib")
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
97
98
99
100
101
/*void TreeUpdate(): функция идентифицирует (обновляет), подключенные USB и HID устройства и выводит их в TreeView (DevTree)*/
private: System::Void TreeUpdate() {
            GUID GUID_USB_DEVICE = { 0x36FC9E60, 0xC465, 0x11CF, 0x80, 0x56, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00 };
            GUID GUID_HID_DEVICE = { 0x745a17a0, 0x74d3, 0x11d0, 0xb6, 0xfe, 0x00, 0xa0, 0xc9, 0x0f, 0x57, 0xda };
            HDEVINFO PnPHandle_USB = NULL;
            HDEVINFO PnPHandle_HID = NULL;
            SP_DEVINFO_DATA DeviceInfoData;
            SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
            PBYTE  buffer;
            DWORD  buffersize = 0;
 
            DevTree->Nodes[0]->Nodes->Clear();
            DevTree->Nodes[1]->Nodes->Clear();
            cbDevList->Items->Clear();
 
            PnPHandle_USB = SetupDiGetClassDevs
                (&GUID_USB_DEVICE, // GUID
                0,
                0,
                DIGCF_PRESENT // список (USB) устройств, которые в настоящее время присутствуют в системе
                );
            PnPHandle_HID = SetupDiGetClassDevs
                (&GUID_HID_DEVICE, // GUID
                0,
                0,
                DIGCF_PRESENT // список (HID) устройств, которые в настоящее время присутствуют в системе
                );
 
            if ((PnPHandle_USB == INVALID_HANDLE_VALUE) && (PnPHandle_HID == INVALID_HANDLE_VALUE))
            {
                MessageBox::Show("Список устройств НЕ получен!", "Warning!");
                return;
            }
 
            DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
            DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
 
            int ch = 0;
            int k = 0;
            // берем каждое USB устройство из списка
            for (ch = 0; SetupDiEnumDeviceInfo(PnPHandle_USB, k, &DeviceInfoData); k++)
            {
                buffer = 0;
                buffersize = 0;
                // и читаем его свойства в буфер
                while (!SetupDiGetDeviceRegistryProperty(
                    PnPHandle_USB,
                    &DeviceInfoData,
                    SPDRP_DEVICEDESC,
                    NULL,
                    buffer,
                    buffersize,
                    &buffersize))
                {
                    if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
                    {
                        if (buffer) LocalFree(buffer);
                        buffer = (PBYTE)LocalAlloc(LPTR, buffersize * 2);
                    }
                    else break;
                }
                ch++;
                // Вывод USB идентифицированных устройств в DevTree
                // Заполняем дочерние элементы первого узла дерева Node[0]
                DevTree->Nodes[0]->Nodes->Add(gcnew String(reinterpret_cast<wchar_t*>(buffer)));
                cbDevList->Items->Add(gcnew String(reinterpret_cast<wchar_t*>(buffer)));
            }
 
            ch = 0; k = 0;
            // берем каждое HID устройство из списка
            for (ch = 0; SetupDiEnumDeviceInfo(PnPHandle_HID, k, &DeviceInfoData); k++)
            {
                buffer = 0;
                buffersize = 0;
                // и читаем его свойства в буфер
                while (!SetupDiGetDeviceRegistryProperty(
                    PnPHandle_HID,
                    &DeviceInfoData,
                    SPDRP_DEVICEDESC,
                    NULL,
                    buffer,
                    buffersize,
                    &buffersize))
                {
                    if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
                    {
                        if (buffer) LocalFree(buffer);
                        buffer = (PBYTE)LocalAlloc(LPTR, buffersize * 2);
                    }
                    else break;
                }
                ch++;
                // Вывод HID идентифицированных устройств в DevTree
                // Заполняем дочерние элементы первого узла дерева Node[0]
                DevTree->Nodes[1]->Nodes->Add(gcnew String(reinterpret_cast<wchar_t*>(buffer)));
                cbDevList->Items->Add(gcnew String(reinterpret_cast<wchar_t*>(buffer)));
            }
 
            SetupDiDestroyDeviceInfoList(PnPHandle_USB);
            SetupDiDestroyDeviceInfoList(PnPHandle_HID);
}
Он рабочий(Неожиданное начало, не правда ли?)) )! Функция заполняет в дерево TreeView список, подключенных USB устройств. Хочу сделать, что бы потом по щелчку, ну т.е. когда выбираю в дереве какой-то элемент, я мог получить номер COM-порта, на котором он сидит (если такой есть вообще).
Пока теряюсь в идеях и догадках как бы это лучше и адекватнее, с меньшим количеством заморочек, организовать... Кто может помочь, подсказать, поделиться идеями? Примеры, или модификации непосредственно моего кода приветствуются
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.04.2016, 23:36
Ответы с готовыми решениями:

usb - устройство не опознано. последнее usb - устройство, подключенное к этому компьютеру, работает неправильно, и Windo
Доброго времени суток. Usb - накопитель появляется на секунд 10 и пропадает. Проверял на Win 10, 7, astra linux в трее появляется...

Как программно перезагрузить устройство, подключенное по USB
Требуется перезагрузить или вовсе выключить Android или iOS используя USB и язык VB.NeT. Возможно ли это вообще? iTunes как то...

Как расшифровать номер USB порта и хаба по Device ID присооединенного устройства
Если тема не для того раздела, пусть модераторы перенесут. Ни в Google, ни в Yandex, не нашел ответа. Device ID USB устройства имеет...

12
Эксперт .NET
 Аватар для Rius
13205 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,560
Записей в блоге: 14
13.04.2016, 06:07
Попробуйте соеденить с перечислением COM портов: http://www.nakov.com/blog/2009... tion-in-c/
0
6 / 5 / 3
Регистрация: 04.06.2015
Сообщений: 250
Записей в блоге: 1
14.04.2016, 21:07  [ТС]
Товарищи коллеги! Прошу меня извинить, в описании своего вопроса я допустил некоторую ошибку - не COM-порты мне нужны, а USB. Извините, мой недочет... Я почему-то думал, что у USB портов и COM реализация передачи данных одинаковая. Пробовал разные примеры по заданному выше вопросу и удивлялся, почему вроде как рабочие примеры кодов, выдают не те результаты, а оно и естественно - у меня же в ноутбуке COM-портов то и нету, есть только USB)) Затупил слегка, бывает...

Ну, а теперь по сути. Если я хочу, выбрав устройство, полученное из списка устройств классов USB и HID (код выше), передать/считать с него данные, как это можно сделать? Как обратиться к USB-порту, выбранного устройства?
С подобного рода задачей ранее еще не сталкивался, по этому тема эта для меня новая, так что буду признателен любым ссылкам на статьи или любую другую полезную информацию касаемо моего вопроса. Спасибо!
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9674 / 4826 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
15.04.2016, 07:52
Для работы с последовательными портами есть значительно более простой API - System.IO.Ports.SerialPort
0
Эксперт .NET
 Аватар для Rius
13205 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,560
Записей в блоге: 14
15.04.2016, 09:01
Cha1000000, вот это можно допилить: A USB HID Component for C#" by wimar | 22 Mar 2007.

Не по теме:

0
6 / 5 / 3
Регистрация: 04.06.2015
Сообщений: 250
Записей в блоге: 1
15.04.2016, 10:47  [ТС]
Спасибо, буду разбираться...

Добавлено через 32 минуты
Спасибо за ответ и ссылку! Возможно мне эти исходники пригодятся в будущем. Однако на C# я еще не пишу и понимаю его лишь интуитивно пока (с плюсами конечно схожесть большая, 80% наверное, но некоторые моменты пока что не знаю). По этому с этими исходниками, боюсь, долго буду разбираться. Сам пишу проект на С++/CLI Windows Forms
0
6 / 5 / 3
Регистрация: 04.06.2015
Сообщений: 250
Записей в блоге: 1
16.04.2016, 13:18  [ТС]
Цитата Сообщение от tezaurismosis Посмотреть сообщение
Для работы с последовательными портами есть значительно более простой API - System.IO.Ports.SerialPort
Доброго времени суток, уважаемый коллега!
Прочел информацию, по приведенной Вами ссылке, попробовал запустить пример, который там даётся, а так же пример из ссылки о методе SerialPort::GetPortNames, и еще пробовал такой вариант получения списка портов:
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
unsigned long error;
 
bool GetAccessToUSB(HDEVINFO hDevInfo, GUID &interfaceGuid, int index, WCHAR* DevPath){
    SP_DEVICE_INTERFACE_DATA            DeviceInterfaceData;
    PSP_DEVICE_INTERFACE_DETAIL_DATA    DeviceInterfaceDetailData;
    SP_DEVINFO_DATA                     DevInfo;
    ULONG                               requiredSize;
    bool                                bReturn;
 
    //PSP_DEVICE_INTERFACE_DATA DevInfoData = (PSP_DEVICE_INTERFACE_DATA)malloc(sizeof(SP_DEVICE_INTERFACE_DATA));
    DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
    if (SetupDiEnumDeviceInterfaces(hDevInfo, 0, &interfaceGuid, index, &DeviceInterfaceData))
    {
        bReturn = SetupDiGetDeviceInterfaceDetail(hDevInfo,
            &DeviceInterfaceData,
            NULL,
            0,
            &requiredSize,
            NULL
            );
        DeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(requiredSize);
        DeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
        DevInfo.cbSize = sizeof(SP_DEVINFO_DATA);
        bReturn = SetupDiGetDeviceInterfaceDetail(hDevInfo,
            &DeviceInterfaceData,
            DeviceInterfaceDetailData,
            requiredSize,
            &requiredSize,
            0);
        if (!bReturn)
        {
            error = GetLastError();
            LocalFree(DeviceInterfaceDetailData);
            return false;
        }
        else
        {
            DevPath = DeviceInterfaceDetailData->DevicePath;
            LocalFree(DeviceInterfaceDetailData);
        }
    }
    else
       {
                error = GetLastError();
        if (error == ERROR_NO_MORE_ITEMS)
            MessageBox::Show("No more interfaces.", "WTF???");
        else
             Exception("SetupDiEnumDeviceInterfaces failed with error: " + error);
        return false;
 
    return true;
}
Однако во всех трёх случаях мне выдаёт что портов не существует, или как в приведенном выше коде, вываливается в сообщение No more interfaces.
Я немного в замешательстве. Может Вы поможете прояснить в чем может быть дело? Значит ли всё это, что такими примерами я пытаюсь получить COM-порты, а у меня их в ноутбуке тупо НЕТ!? Мне ведь надо список USB портов получить. Значит эти варианты мне не подходят просто на просто? Я правильно понял? Подскажите, пожалуйста, а то кажется я уже хожу по кругу и попал в тупик!(((
0
6 / 5 / 3
Регистрация: 04.06.2015
Сообщений: 250
Записей в блоге: 1
18.04.2016, 14:49  [ТС]
Всем доброго времени суток! Надеюсь, пишу не в пустоту...
В общем покопался еще по интернету, погуглив свой вопрос, нашел на микросине примеры применения нескольких библиотек и заголовочных файлов для работы с HID устройствами по USB. Остановился на применении библиотеки HID.dll c использованием заголовочного файла hidlibrary.h, который внутри себя вытаскивает определения функций из dll... Ну короче выглядит так:
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
// Библиотека для работы с Hid. Написана с применением шаблонов.
// Она с помощью WINAPI функции LoadLibrary подгружает hid.dll,
// затем GetProcAddress - вычисляет адреса функций внутри hid.dll.
// Предоставляет удобный и простый интерфейс для работы с HID.
// Нашел на [url]http://speleoastronomy.org/elektro/atmega/usingusb.html[/url]
// Дописал функцию IsConnectedDevice()
 
const char idstring[] = "vid_046D&pid_C219";
 
#include <windows.h>
#include <setupapi.h>
#include <string>
#include <vector>
#include <map>
 
typedef void (WINAPI* t_HidD_GetHidGuid)( OUT LPGUID );
typedef BOOLEAN (WINAPI* t_HidD_GetManufacturerString)(IN HANDLE, OUT PVOID, IN ULONG);
typedef BOOLEAN (WINAPI* t_HidD_GetProductString)(IN HANDLE, OUT PVOID, IN ULONG);
typedef BOOLEAN (WINAPI* t_HidD_GetFeature)(IN HANDLE, OUT PVOID, IN ULONG);
typedef BOOLEAN (WINAPI* t_HidD_SetFeature)(IN HANDLE, IN PVOID, IN ULONG);
 
using namespace std;
 
template <typename T> class HIDLibrary
{
protected:
    static const int datasize = sizeof(T);
    T data;
    char pad[16];
    GUID m_hidguid;
    HINSTANCE hDLL; 
    t_HidD_GetHidGuid HidD_GetHidGuid;
    t_HidD_GetManufacturerString HidD_GetManufacturerString;
    t_HidD_GetProductString HidD_GetProductString;
    t_HidD_GetFeature HidD_GetFeature;
    t_HidD_SetFeature HidD_SetFeature;
    vector<string> m_HIDPaths;
    map<string,string> m_HIDDeviceIdents;
    //string GetDevicePath(HDEVINFO hInfoSet, PSP_DEVICE_INTERFACE_DATA oInterface);
    string m_ConnectedDevice;
public:
    HIDLibrary();
    bool IsAvailableLib();
    int EnumerateHIDDevices();
    bool Connect(unsigned int device=0);
    string GetDevicePath(HDEVINFO hInfoSet, PSP_DEVICE_INTERFACE_DATA oInterface);
    string GetConnectedDevicePath(){return m_ConnectedDevice;};
    string GetConnectedDeviceName(){return m_HIDDeviceIdents[m_ConnectedDevice];};
    string GetDeviceCount() { return m_HIDPaths.size(); };
    string GetDeviceName(int i){
                                    if(i<m_HIDPaths.size()) 
                                        return m_HIDDeviceIdents[m_HIDPaths[i]]; 
                                    else 
                                        return string.empty;
                                }
    int SendData(T* data);
    int ReceiveData(T* data);
    int IsConnectedDevice();
};
 
template< typename T > HIDLibrary< T >::HIDLibrary()
{
        hDLL = LoadLibrary(L"HID.DLL");
        if(hDLL != NULL)
        {
           HidD_GetHidGuid = (t_HidD_GetHidGuid)GetProcAddress(hDLL, "HidD_GetHidGuid");
           HidD_GetManufacturerString = (t_HidD_GetManufacturerString)GetProcAddress(hDLL, "HidD_GetManufacturerString");
           HidD_GetProductString = (t_HidD_GetProductString) GetProcAddress(hDLL, "HidD_GetProductString");
           HidD_GetFeature = (t_HidD_GetFeature) GetProcAddress(hDLL, "HidD_GetFeature");
           HidD_SetFeature = (t_HidD_SetFeature) GetProcAddress(hDLL, "HidD_SetFeature");
           if(HidD_GetHidGuid)
           {
              HidD_GetHidGuid(&m_hidguid);
           }
        }
}
 
template< typename T > bool HIDLibrary< T >::IsAvailableLib()
{
    return  !(hDLL == NULL || HidD_GetHidGuid == NULL || HidD_GetManufacturerString == NULL ||
            HidD_GetProductString == NULL || HidD_GetFeature == NULL || HidD_SetFeature == NULL);
}
 
template<typename T> string HIDLibrary<T>::GetDevicePath(HDEVINFO hInfoSet, PSP_DEVICE_INTERFACE_DATA oInterface)
{
        char vpath [1000];
        vpath[0]=0;
        DWORD nRequiredSize = 0;
        // Get the device interface details
        if (!SetupDiGetDeviceInterfaceDetail(hInfoSet, oInterface, 0, 0, &nRequiredSize, 0))
        {
            PSP_DEVICE_INTERFACE_DETAIL_DATA oDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(nRequiredSize);
            oDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);  
            if (SetupDiGetDeviceInterfaceDetail(hInfoSet, oInterface, oDetail, nRequiredSize, &nRequiredSize, 0))
            {
                string s((char*)oDetail->DevicePath);
                free(oDetail);
                return s;
            }
        }
        return "";
}
 
template<typename T> int HIDLibrary<T>::EnumerateHIDDevices()
{
        wchar_t buffer[1000];
        char s1[1000];
        m_HIDPaths.clear();
        int nIndex = 0;
        HDEVINFO hInfoSet = SetupDiGetClassDevs(&m_hidguid,0,0,DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
        SP_DEVICE_INTERFACE_DATA spd;
        spd.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
        while (SetupDiEnumDeviceInterfaces(hInfoSet, 0, &m_hidguid, nIndex, &spd))
        {
            string path = GetDevicePath(hInfoSet, &spd);    
            if(path.find(idstring)!= string::npos)
            {
                HANDLE h = CreateFileA(path.c_str(),GENERIC_READ,0,0,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
                if(h != INVALID_HANDLE_VALUE)
                {
                    HidD_GetManufacturerString(h,buffer,500);
                    wcstombs(s1,buffer, 1000);
                    if(strlen(s1)>2)
                    {
                        strcat(s1," ");
                        HidD_GetProductString(h,buffer,500);
                        wcstombs(s1+strlen(s1),buffer, 1000);
                    }
                    CloseHandle(h);
                }
                else
                    strcpy(s1,"Unknown device");
                string name(s1);
                m_HIDDeviceIdents[path]=s1;
                m_HIDPaths.push_back(path);
            }
            nIndex++;
        }
        SetupDiDestroyDeviceInfoList(hInfoSet);
        return nIndex;
}
 
template<typename T> bool HIDLibrary<T>::Connect(unsigned int device)
{
    if(m_HIDPaths.size() < device+1)
    {
        EnumerateHIDDevices();
        if(m_HIDPaths.size() < device+1) return false;
    }
    m_ConnectedDevice = m_HIDPaths[device];
    return true;
}
 
template<typename T> int HIDLibrary<T>::SendData(T* data)
{
   char vpath[datasize+16];
   vpath[0]=0;
   int len=datasize+1;
   HANDLE h = CreateFileA(m_ConnectedDevice.c_str(),GENERIC_READ,0,0,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
   if(h != INVALID_HANDLE_VALUE)
   {
        memcpy(vpath+1,data,datasize);
        int err = HidD_SetFeature(h, vpath , len);
        CloseHandle(h);
        return err;
   }
   else
        return 0;
}
 
template<typename T> int HIDLibrary<T>::ReceiveData(T* data)
{
    char vpath[datasize+16];
    memset(vpath,0,sizeof(vpath));
    int len=datasize+1;
    HANDLE h = CreateFileA(m_ConnectedDevice.c_str(),GENERIC_READ,0,0,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
   if(h != INVALID_HANDLE_VALUE)
   {
        int err = HidD_GetFeature(h, vpath , len);
        memcpy(data,vpath+1,datasize);
        CloseHandle(h);
        return err;
   }
   else
        return 0;
}
 
template<typename T> int HIDLibrary<T>::IsConnectedDevice()
{
   HANDLE h = CreateFileA(m_ConnectedDevice.c_str(),GENERIC_READ,0,0,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
   if(h != INVALID_HANDLE_VALUE)
   {
        CloseHandle(h);
        return 1;
   }
   else
        return 0;
}
Попробовал из неё воспользоваться функцией GetDevicePath что б получать пути к устройствам. Сделал так:
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
typedef unsigned char uchar;
 
struct dataexchange_t           // Описание структуры для передачи данных
{
    uchar  b1;        
    uchar  b2;        
    uchar  b3;    
    uchar  b4;
    uchar  b5;
    uchar  b6;
    uchar  b7;
    uchar  b8;
    uchar  b9;
    uchar  b10;
    uchar  b11;
    uchar  b12;
    uchar  b13;
    uchar  b14;
    uchar  b15;
    uchar  b16;
};
 
struct dataexchange_t pdata = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 
HIDLibrary <dataexchange_t> hid; // создаем экземпляр класса с типом нашей структуры
 
System::String^ GetPath()
{
    // Получаем путь выбранного устройства
    HDEVINFO hInfoSet = SetupDiGetClassDevs(&GuidDevInterfaceHID, 0, 0, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
    SP_DEVICE_INTERFACE_DATA spd;
    spd.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
    SetupDiEnumDeviceInterfaces(hInfoSet, 0, &GuidDevInterfaceHID, NodeIndex, &spd);
    String^ path = gcnew System::String(hid.GetDevicePath(hInfoSet, &spd).c_str());       // получаем путь
    MessageBox::Show(path, "Debug string");
    return path;
}
Вроде бы работает, но не пойму правильно ли)) Переменная path возвращает значение " \ " . Кто-нибудь может объяснить или поделиться своими мыслями по поводу: "что это значит?" и "правильно ли это?"
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9674 / 4826 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
19.04.2016, 03:07
Возможно Убежденный знает ответ, вопрос касается C++/CLI лишь косвенно.
Этим сообщением я послал ему уведомление, возможно он заинтересуется темой.
0
6 / 5 / 3
Регистрация: 04.06.2015
Сообщений: 250
Записей в блоге: 1
19.04.2016, 12:38  [ТС]
Цитата Сообщение от tezaurismosis Посмотреть сообщение
Этим сообщением я послал ему уведомление, возможно он заинтересуется темой.
Большое спасибо! Знаю, что раздел для этой темы выбрал не совсем подходящий, но, как и писал в первом посте, в начале, я так и не определился в какой раздел будет вернее поместить эту тему... Может модераторы решат переместить её в более актуальное место... Было бы неплохо)
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
19.04.2016, 22:34
Цитата Сообщение от Cha1000000 Посмотреть сообщение
Переменная path возвращает значение " \ " . Кто-нибудь может объяснить или поделиться своими мыслями по поводу: "что это значит?" и "правильно ли это?"
Символьная ссылка вида "\" - это явно неправильно.
Хотя, возможно, тут просто путаница с кодировками, и "\" - это на самом
деле начало более длинной строки, просто по каким-то причинам отображается
только первый символ (я в C++/CLI не силен, так что точно не скажу).

Кстати, SetupDiEnumDeviceInterfaces нужно вызывать в цикле, см. документацию.
Да, и очень желательно всегда проверять, что возвращают функции,
потому что успех не гарантирован
А в случае ошибки обычно зовут GetLastError().
1
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9674 / 4826 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
19.04.2016, 22:52
Cha1000000, чтобы исключить влияние C++/CLI на вывод, используйте стандартные средства Си и C++ для вывода (std::cout, например).
Раз метод hid.GetDevicePath() возвращает std::string, для преобразования в System::String попробуйте
C++
1
String^ path = marshal_as<String^>(hid.GetDevicePath(hInfoSet, &spd));
Преобразование текста Native <-> .NET зачастую очень запутано и потерять часть данных или их изначальный вид довольно просто (вы и сами это знаете).
0
6 / 5 / 3
Регистрация: 04.06.2015
Сообщений: 250
Записей в блоге: 1
20.04.2016, 00:10  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Кстати, SetupDiEnumDeviceInterfaces нужно вызывать в цикле, см. документацию.
Да, и очень желательно всегда проверять, что возвращают функции,
потому что успех не гарантирован
А в случае ошибки обычно зовут GetLastError().
Спасибо. Это я учту! Попробую чуть по другому и с проверками на ошибки.

Цитата Сообщение от tezaurismosis Посмотреть сообщение
чтобы исключить влияние C++/CLI на вывод, используйте стандартные средства Си и C++ для вывода (std::cout, например).
У меня же не консольное приложение. На сколько я знаю, std::cout только для вывода в консоли используется (поправьте, если я ошибаюсь). Это вообще мой первый крупный (относительно) проект в С++ именно на C++/CLI. Раньше на Билдере только приложения с GUI делал и не знал горя с этими .NET-овскими заморочками... Хотя, признаться, многие моменты мне по началу, с непривыку, казались замороченными и "нафиг не нужными", а сейчас даже приловчился к ним уже и кое-что бывает, даже больше нравится, чем в типичном Билдеровском синтаксисе. Но, пожалуй, в следующих приложениях, если понадобится GUI разрабатывать, то либо на С# (родном для .NET), либо без особых заморочек на старом-добром Билдере буду клепать... Ну и еще от времени и личного энтузиазма будет зависеть, конечно)))
Всем спасибо за советы и подсказки (нет, это еще не все, тему можно не закрывать )!
Я нашел (где, уже честно говоря, не помню... возможно даже и в какой-то из тем именно этого форума... скачал и на радостях вкладку закрыл и не запомнил, ну не суть...) довольно подходящий под сою задачу пример (исходники проекта рабочего тоже на C++/CLI под 10 студию. Вот сейчас разбираюсь с ним, кое-что уже успел использовать от туда в своем проекте. Когда еще вдруг появятся вопросы (а я в этом не сомневаюсь ), обязательно задам их в этой же теме ;-) Еще раз всем спасибо и за будущие ответы (надеюсь) заранее
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.04.2016, 00:10
Помогаю со студенческими работами здесь

Как получить данные с USB порта?
Всем привет! Сразу скажу,что с портами раньше дела не имел и для меня они темный лес. Задача такая.Некое устройство,время от времени...

Как получить номер порта клиента?
Добрый день коллеги, подскажите пожалуйста. Проблема в следующем, клиент подключается к серверу используя сокет, мне нужен номер порта...

Аварийное выдергивание FTDI из порта USB: повторно запускаться и работать устройство не хочет
Здрувствуйте форумчане! Пишу библиотеку dll на C#. В моей библиотеке подгружается еще одна библиотека FTd2xx.dll и импортируются ее...

Два порта на корпусе. Один работает, другой нет. USB-устройство не опознано
Два порта на корпусе. Один работает, другой нет. При подключении флешки молчит, при подключении периферии (геймпад, клавиатура) выдает...

Как получить номер КОМ-порта зная VID и PID
Как получить номер COM-порта зная VID и PID? Кто нить сталкивался? Хочу, чтобы оно само поставляло номер порта. Спасибо


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru