Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class SystemInfo : public QObject
- {
- Q_OBJECT
- public:
- SystemInfo(QString lpRemoteName = ".");
- ~SystemInfo();
- QVector<QPair<QString, QString>> getPointingDevices();
- private:
- QAxObject *objWMIService; // не удалять
- QAxObject *objInterList; // не удалять
- QAxObject *item = 0;
- QString query;
- bool initializeItem(IEnumVARIANT *enumInterface);
- IEnumVARIANT *halfInitialize();
- };
- SystemInfo::SystemInfo(QString lpRemoteName)
- {
- if (lpRemoteName == "")
- lpRemoteName = ".";
- QAxObject *objIWbemLocator = new QAxObject("WbemScripting.SWbemLocator");
- QObject::connect(objIWbemLocator, SIGNAL(exception(int, QString, QString, QString)), this, SLOT(wmi_error(int,QString,QString,QString)));
- if (!objIWbemLocator)
- qDebug("Не создался WbemScripting.SWbemLocator");
- objWMIService = objIWbemLocator->querySubObject(
- "ConnectServer(QString&,QString&)", //objWMIService - объявляем как переменную член класса, память выделяем в конструкторе
- lpRemoteName, QString("root\cimv2")); // пространство имен. Если и домен и рабочая группа, можно прикрутить аутентификацию
- if (!objWMIService)
- {
- qDebug("Не создался WMIService");
- objIWbemLocator->clear();
- objIWbemLocator->deleteLater();
- throw "error";
- }
- objIWbemLocator->clear();
- objIWbemLocator->deleteLater();
- }
- SystemInfo::~SystemInfo()
- {
- objWMIService->clear();
- objWMIService->deleteLater();
- }
- QVector<QPair<QString, QString> > SystemInfo::getPointingDevices()
- {
- QVector<QPair<QString, QString>> vec;
- query = QString("SELECT * FROM Win32_PointingDevice");
- IEnumVARIANT *enumInterface = halfInitialize();
- if (enumInterface != nullptr)
- {
- for (int i = 0; i < objInterList->dynamicCall("Count").toInt(); i++)
- {
- if (initializeItem(enumInterface))
- {
- vec.push_back(QPair<QString, QString>("Имя устройства ввода", item->dynamicCall("Name").toString()));
- vec.push_back(QPair<QString, QString>("Описание устройства ввода", item->dynamicCall("Description").toString()));
- vec.push_back(QPair<QString, QString>("Id устройства ввода", item->dynamicCall("DeviceID").toString()));
- vec.push_back(QPair<QString, QString>("Интерфейс устройства ввода", item->dynamicCall("DeviceInterface").toString()));
- vec.push_back(QPair<QString, QString>("Тип устройства ввода", item->dynamicCall("HardwareType").toString()));
- item->deleteLater();
- }
- }
- objInterList->deleteLater();
- enumInterface->Release();
- }
- return vec;
- }
- bool SystemInfo::initializeItem(IEnumVARIANT *enumInterface)
- {
- VARIANT *theItem = (VARIANT*)malloc(sizeof(VARIANT));
- if (enumInterface->Next(1,theItem,NULL) == S_FALSE)
- return false;
- item = new QAxObject((IUnknown*)theItem->punkVal);
- free(theItem);
- if (!item)
- {
- item->deleteLater();
- return false;
- }
- return true;
- }
- IEnumVARIANT* SystemInfo::halfInitialize()
- {
- objInterList = objWMIService->querySubObject("ExecQuery(QString&))", query);
- if (!objInterList)
- return nullptr;
- if (objInterList->dynamicCall("Count").toInt() == 0)
- return nullptr;
- QAxObject *enum1 = objInterList->querySubObject("_NewEnum");
- if (!enum1)
- return nullptr;
- IEnumVARIANT* enumInterface = 0;
- enum1->queryInterface(IID_IEnumVARIANT, (void**)&enumInterface);
- enum1->deleteLater();
- if (!enumInterface)
- return nullptr;
- enumInterface->Reset();
- return enumInterface;
- }
- if (initializeItem(enumInterface))
- {
- vec.push_back(QPair<QString, QString>("Имя устройства ввода", item->dynamicCall("Name").toString()));
- vec.push_back(QPair<QString, QString>("Описание устройства ввода", item->dynamicCall("Description").toString()));
- vec.push_back(QPair<QString, QString>("Id устройства ввода", item->dynamicCall("DeviceID").toString()));
- vec.push_back(QPair<QString, QString>("Интерфейс устройства ввода", item->dynamicCall("DeviceInterface").toString()));
- vec.push_back(QPair<QString, QString>("Тип устройства ввода", item->dynamicCall("HardwareType").toString()));
- item->deleteLater();
- }
Add Comment
Please, Sign In to add comment