Russian Qt Forum
Май 09, 2024, 23:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Значение ключа реестра (WinAPI)  (Прочитано 6317 раз)
Arrovil
Гость
« : Март 01, 2011, 12:26 »

Доброго времени суток. Задача такова, что надо получить список всех com-портов в системе (WinXP). Вариант с попыткой записи чего-нибудь в каждый порт не подходит - порт может быть занят, тогда тоже не будет ответа. Остается вариант через реестр: в ветке HKEY_LOCAL_MACHINEHARDWARE\DEVICEMAP\SERIALCOMM есть соответствующие ключи вида \Device\Serial0 со значением COM0. Через QSettings не получится - ключи имеют обратный слэш, который не поддерживается. В документации говорят юзать WinAPI.
Тут, собственно, и возникает проблема: получаю только одно значение (притом из трех имеющихся в реестре - почему-то среднее).
Вот код:
Код
C++ (Qt)
   HKEY hKey;
   int i=0;
   TCHAR Name[4096];
   TCHAR Value[4096];
   DWORD cName=4096;
   DWORD cValue=4096;
   QString myports;
 
   if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"HARDWARE\\DEVICEMAP\\SERIALCOMM", 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)
   {
       while(RegEnumValue(hKey,i,Name,&cName,NULL,NULL,(LPBYTE)&Value,&cValue)==ERROR_SUCCESS)
       {
           myports.append(QString::fromUtf16((ushort*)Value));
           i++;
       }
       QMessageBox::information(this, QString::number(i, 10), myports);
   }
 
Подскажите, в чем именно ошибка?
Записан
vunder
Гость
« Ответ #1 : Март 01, 2011, 15:37 »

Все просто до безобразия.
После первого вызова значения размеров буферов, передаваемых в функцию (cName и cValue) изменяются на размеры соответствующих строк, поэтому перед каждным новым вызовом из нужно заново инициализоровать.
Вообще принято делать так:
Код
C++ (Qt)
RegEnumValue(hKey,i,Name,&(cName = 4096),NULL,NULL,(LPBYTE)&Value,&(cValue = 4096))
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Март 01, 2011, 17:06 »

Arrovol,

вот в помощь уже готовое:

QSerialDevice -> http://gitorious.org/qserialdevice
или
QextSerialPort -> http://code.google.com/p/qextserialport/

Если нужно именно извлекать из ( KEY_LOCAL_MACHINEHARDWARE\DEVICEMAP\SERIALCOMM ) - то поможет (вроде)
QSerialDevice  древней версии 0.1.0 или 0.2.0 - там именно таким образом оно добывалось.
Записан

ArchLinux x86_64 / Win10 64 bit
Arrovil
Гость
« Ответ #3 : Март 02, 2011, 10:13 »

vunder, спасибо, заработало все.
Я уже выловил ошибку 234 (наличие еще какого-то объема данных), начал обнулять массивы в цикле, но ничего не менялось. А оказывается, нужно было инициализировать заново... Благодарю за совет.

kuzulis, да, я видел, но там вроде несколько по другому это реализовано, плюс тоже какие-то вопросы возникали. Хотя если в старых версиях это тоже через эти же ключи делалось, надо будет посмотреть. В любом случае, спасибо за подсказку.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.094 секунд. Запросов: 23.