Russian Qt Forum

Qt => Общие вопросы => Тема начата: Arrovil от Марта 01, 2011, 12:26



Название: Значение ключа реестра (WinAPI)
Отправлено: 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);
   }
 
Подскажите, в чем именно ошибка?


Название: Re: Значение ключа реестра (WinAPI)
Отправлено: vunder от Марта 01, 2011, 15:37
Все просто до безобразия.
После первого вызова значения размеров буферов, передаваемых в функцию (cName и cValue) изменяются на размеры соответствующих строк, поэтому перед каждным новым вызовом из нужно заново инициализоровать.
Вообще принято делать так:
Код
C++ (Qt)
RegEnumValue(hKey,i,Name,&(cName = 4096),NULL,NULL,(LPBYTE)&Value,&(cValue = 4096))


Название: Re: Значение ключа реестра (WinAPI)
Отправлено: kuzulis от Марта 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 - там именно таким образом оно добывалось.


Название: Re: Значение ключа реестра (WinAPI)
Отправлено: Arrovil от Марта 02, 2011, 10:13
vunder, спасибо, заработало все.
Я уже выловил ошибку 234 (наличие еще какого-то объема данных), начал обнулять массивы в цикле, но ничего не менялось. А оказывается, нужно было инициализировать заново... Благодарю за совет.

kuzulis, да, я видел, но там вроде несколько по другому это реализовано, плюс тоже какие-то вопросы возникали. Хотя если в старых версиях это тоже через эти же ключи делалось, надо будет посмотреть. В любом случае, спасибо за подсказку.