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

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

12.04.2016, 23:36. Показов 6335. Ответов 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
13023 / 7588 / 1661
Регистрация: 25.05.2015
Сообщений: 23,072
Записей в блоге: 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
9670 / 4823 / 762
Регистрация: 17.04.2012
Сообщений: 9,661
Записей в блоге: 14
15.04.2016, 07:52
Для работы с последовательными портами есть значительно более простой API - System.IO.Ports.SerialPort
0
Эксперт .NET
 Аватар для Rius
13023 / 7588 / 1661
Регистрация: 25.05.2015
Сообщений: 23,072
Записей в блоге: 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
9670 / 4823 / 762
Регистрация: 17.04.2012
Сообщений: 9,661
Записей в блоге: 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
9670 / 4823 / 762
Регистрация: 17.04.2012
Сообщений: 9,661
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru