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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [решено но по иному] WMI и minGW и QT4 получение конфигурации устройств. Как?  (Прочитано 10485 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« : Июнь 24, 2009, 10:00 »

Доброго дня!

Тут возник у меня "затык" в части определения списка последовательных устройств в системе. т.е мне нужно получить имена всех последовательных портов имеющихся в системе.

1. Я пробовал применить WinAPI ф-ю : QueryDosDevice
Код:
#include <QtCore>
#include <windows.h>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (!(GetVersionEx(&osvi) && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT))) {
qDebug() << "Error OS type";
return 0;
}
//
CHAR res[65535];
DWORD retval=QueryDosDeviceA("COM1", res, 65535);
QString tmp = QString("retval : %1").arg(retval);
qDebug() << tmp;
qDebug() << res;
    return app.exec();
}
выводит в консоль:
Цитировать
D:\projects\QSerialDevice_24062009_1700\examples\devices>release\default.exe
"retval : 17"
\Device\Serial0
т.е нет в имени упоминания слова COMxxx ... т.е. результат - мне не годится этот способ т.к. мне нужен список в виде:
COM1
COM2
....
COMN
+ чтобы и "виртуальные" устройства можно было бы сюда добавить (например всякого рода конвертеры USB<->RS232)

2. вычитал потом про сервис WMI в венде и нашел простой пример на VBS:
Код:
On Error Resume Next
Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
If Err.Number <> 0 Then
WScript.Echo Err.Number & ": " & Err.Description
WScript.Quit
End If
For Each objPort In objService.ExecQuery("SELECT * FROM Win32_SerialPort")
WScript.Echo objPort.Caption 'наименование устройства
WScript.Echo objPort.Description 'описание устройства
WScript.Echo objPort.DeviceID 'идентификатор устройства
WScript.Echo objPort.PNPDeviceID 'идентификатор устройства Plug-and-Play
WScript.Echo objPort.SystemName 'имя компьютера
WScript.Echo
Next
как бы мне смоч прикрутить это дело к QT так, чтобы можно было использовать?

3. Вычитал о том что можно из реестра взять инфрмацию.. но как это сделать в QT4 не имею понятия!


Люди, поможите чем могёте! Грустный



« Последнее редактирование: Июль 17, 2009, 08:05 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Rcus
Гость
« Ответ #1 : Июнь 24, 2009, 10:16 »

/* sigh */ Если брать чистый Win32API, то всю информацию по нему можно найти в msdn, там есть примеры и на c++. Если же хочется каких-нибудь оберток, то тут не знаю чем помочь... Вроде для Solid делали backend на WMI, но не знаю как там дела обстоят.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Июнь 24, 2009, 10:31 »

Цитировать
Если брать чистый Win32API, то всю информацию по нему можно найти в msdn, там есть примеры и на c++.
да, есть, но там подключаются заголовочные файлы, которых нет в MinGW ! Улыбающийся

набрел тут на сайт : http://forum.ixbt.com/topic.cgi?id=26:34140
и там :
Цитировать
В Win2000/XP можно прочитать ветку реестра 'HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM'

думаю проще всего лазить по этому пути в реестре и смотреть что там есть.. но .. опять же не знаю с помошью чего в реестре лазить и как читать!

QSettings вроде там не ищет.. он ищет только тут (из ассистента):
Цитировать
On Windows, NativeFormat settings are stored in the following registry paths:
HKEY_CURRENT_USER\Software\MySoft\Star Runner
HKEY_CURRENT_USER\Software\MySoft
HKEY_LOCAL_MACHINE\Software\MySoft\Star Runner
HKEY_LOCAL_MACHINE\Software\MySoft

Грустный


упс.. забираю слова обратно.. Улыбающийся
нашел и это:
Цитировать
        QSettings settings("HKEY_CURRENT_USER\\Software\\Microsoft",
                           QSettings::NativeFormat);
« Последнее редактирование: Июнь 24, 2009, 10:34 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Июнь 24, 2009, 10:36 »

kuzulis, это подойдёт?
Записан

Юра.
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #4 : Июнь 24, 2009, 10:45 »

вот набросал примерчик:
Код:
#include <QtCore>
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
QSettings settings("HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM",QSettings::NativeFormat);
QString port = settings.value("\Device\Serial0").toString(); // <--- ЭТО строка №11
qDebug() << port;
    return app.exec();
}

но выводит:
Цитировать
D:\projects\QSerialDevice_24062009_1700\examples\devices>release\default.exe
""

и притом при компиляции говорит что:
Цитировать
main.cpp:11:32: warning: unknown escape sequence '\D'
main.cpp:11:32: warning: unknown escape sequence '\S'
Записан

ArchLinux x86_64 / Win10 64 bit
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #5 : Июнь 24, 2009, 10:49 »

2 lit-uriy,
спасибо, но я не знаю, будет ли эта ф-я работать для win64 и т.п. . но попробую
Записан

ArchLinux x86_64 / Win10 64 bit
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Июнь 24, 2009, 10:52 »

>>и притом при компиляции говорит что
дак ты двойные слэши сделай этож С\С++
Записан

Юра.
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #7 : Июнь 24, 2009, 10:56 »

спс.. теперь варнингов не выводит..
и я добавил такую строчку :
Код:
..
qDebug() << settings.allKeys();
..
теперь после выполнения выводит:
Цитировать
D:\projects\QSerialDevice_24062009_1700\examples\devices>release\default.exe
""
("/Device/Serial0")

т.е. как бы правильно подставить ключ ("/Device/Serial0") Непонимающий??
Записан

ArchLinux x86_64 / Win10 64 bit
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #8 : Июнь 24, 2009, 11:00 »

вообще затея с автоматическим поиском имён устройств плохая. Работать будет разве что на виндовозе.
Так например адаптеры USB<->RS-232 в *nix'ах под самыми разными именами создаются, да и штатные порты сильно отличаются по именам.
Записан

Юра.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Июнь 24, 2009, 11:02 »

>>будет ли эта ф-я работать для win64 и т.п.
>>т.е. как бы правильно подставить ключ ("/Device/Serial0")

В виндовозе наблюдается тенденция к возвращению на Юникс путь.
Даже в вин2к такие имена используются в нутри системы.

Я не пробовал но может прямо так и можно подставить в API функцию openFile
Записан

Юра.
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #10 : Июнь 24, 2009, 11:27 »

Цитировать
вообще затея с автоматическим поиском имён устройств плохая. Работать будет разве что на виндовозе.
Так например адаптеры USB<->RS-232 в *nix'ах под самыми разными именами создаются, да и штатные порты сильно отличаются по именам.

ну мне и нужно под виндус только ! Улыбающийся
под *.nix я уже написал метод (там просто идет перебор имен устройств из /dev и нужные заносятся в QStringList)

Цитировать
В виндовозе наблюдается тенденция к возвращению на Юникс путь.
Даже в вин2к такие имена используются в нутри системы.

ну а для API ф-ции CreateFile необходимо указывать COM1 COM2 и т.п (вроде) - поэтому нужен список именно с такими аббревиатурами

Цитировать
Я не пробовал но может прямо так и можно подставить в API функцию openFile

хез.. мож и можно Улыбающийся

...
думаю самое простое - читать реестр...  вот только бы ключ правильно составить ! Грустный
Записан

ArchLinux x86_64 / Win10 64 bit
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #11 : Июнь 24, 2009, 11:33 »

Цитировать
Цитировать
Я не пробовал но может прямо так и можно подставить в API функцию openFile

хез.. мож и можно Улыбающийся
не.. не работает

....
что-то и QSettings не хочет подхватывать ключ.. Я даже экспортировал этот ключ в файл *.reg из реестра:
Цитировать
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM]
"\\Device\\Serial0"="COM1"
и подставлял в метод value это : "\\Device\\Serial0" - но не работает что то

-------

Ёлки, этот метод тож можно вычеткнуть.. т.к. тут http://www.qtcentre.org/forum/f-qt-programming-2/t-how-can-i-read-deviceserial0-value-with-qsettings-in-windows-registry--16089.html/?highlight=QSettings

написано что это невозможно
« Последнее редактирование: Июнь 24, 2009, 11:55 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #12 : Июнь 24, 2009, 12:07 »

мне эксперементировать влом, но коль уж ты озадачился, попробуй ещё такой вариант:
"\"\\Device\\Serial0\""
Записан

Юра.
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #13 : Июнь 24, 2009, 13:59 »

ВСЕ! Я победил это!
 код:
Код:
/*
\en
\ru
*/

#include <QtCore>
#include <windows.h>
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

LONG retVal=0;
DWORD Index=0;
DWORD dwTypeCode;
char KeyParam[256];
char KeyValue[256];
DWORD dwKeyParamLength = sizeof(KeyParam);
DWORD dwKeyValueLength = sizeof(KeyValue);
LONG lnResult;
HKEY hKey;
retVal=RegOpenKeyExA(HKEY_LOCAL_MACHINE,"Hardware\\Devicemap\\Serialcomm", 0, KEY_READ, &hKey);
qDebug() << "RegOpenKeyExA =" << retVal;
while (RegEnumValueA(hKey, Index, KeyParam, &dwKeyParamLength, NULL,
&dwTypeCode, (BYTE *)KeyValue, &dwKeyValueLength) == ERROR_SUCCESS) {
if(dwTypeCode == REG_SZ) {
qDebug() << "Index=" << Index;
qDebug() << "KeyParam=" << KeyParam;
qDebug() << "dwKeyParamLength=" << dwKeyParamLength;
qDebug() << "dwTypeCode=" << dwTypeCode;
qDebug() << "KeyValue=" << KeyValue;
qDebug() << "dwKeyValueLength=" << dwKeyValueLength;
        }
        ++Index;
        dwKeyParamLength = sizeof(KeyParam);
        dwKeyValueLength = sizeof(KeyValue);
}
retVal=RegCloseKey(hKey);
qDebug() << "RegCloseKey=" << retVal;

    return app.exec();
}

ставте тег РЕШЕНО! Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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