Guest User

Untitled

a guest
Jan 23rd, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.57 KB | None | 0 0
  1. class SystemInfo : public QObject
  2. {
  3. Q_OBJECT
  4. public:
  5. SystemInfo(QString lpRemoteName = ".");
  6. ~SystemInfo();
  7. QVector<QPair<QString, QString>> getPointingDevices();
  8.  
  9. private:
  10. QAxObject *objWMIService; // не удалять
  11. QAxObject *objInterList; // не удалять
  12. QAxObject *item = 0;
  13. QString query;
  14.  
  15. bool initializeItem(IEnumVARIANT *enumInterface);
  16. IEnumVARIANT *halfInitialize();
  17. };
  18.  
  19. SystemInfo::SystemInfo(QString lpRemoteName)
  20. {
  21. if (lpRemoteName == "")
  22. lpRemoteName = ".";
  23.  
  24. QAxObject *objIWbemLocator = new QAxObject("WbemScripting.SWbemLocator");
  25.  
  26. QObject::connect(objIWbemLocator, SIGNAL(exception(int, QString, QString, QString)), this, SLOT(wmi_error(int,QString,QString,QString)));
  27. if (!objIWbemLocator)
  28. qDebug("Не создался WbemScripting.SWbemLocator");
  29.  
  30. objWMIService = objIWbemLocator->querySubObject(
  31. "ConnectServer(QString&,QString&)", //objWMIService - объявляем как переменную член класса, память выделяем в конструкторе
  32. lpRemoteName, QString("root\cimv2")); // пространство имен. Если и домен и рабочая группа, можно прикрутить аутентификацию
  33. if (!objWMIService)
  34. {
  35. qDebug("Не создался WMIService");
  36. objIWbemLocator->clear();
  37. objIWbemLocator->deleteLater();
  38. throw "error";
  39. }
  40. objIWbemLocator->clear();
  41. objIWbemLocator->deleteLater();
  42. }
  43.  
  44. SystemInfo::~SystemInfo()
  45. {
  46. objWMIService->clear();
  47. objWMIService->deleteLater();
  48. }
  49.  
  50. QVector<QPair<QString, QString> > SystemInfo::getPointingDevices()
  51. {
  52. QVector<QPair<QString, QString>> vec;
  53. query = QString("SELECT * FROM Win32_PointingDevice");
  54. IEnumVARIANT *enumInterface = halfInitialize();
  55. if (enumInterface != nullptr)
  56. {
  57. for (int i = 0; i < objInterList->dynamicCall("Count").toInt(); i++)
  58. {
  59. if (initializeItem(enumInterface))
  60. {
  61. vec.push_back(QPair<QString, QString>("Имя устройства ввода", item->dynamicCall("Name").toString()));
  62. vec.push_back(QPair<QString, QString>("Описание устройства ввода", item->dynamicCall("Description").toString()));
  63. vec.push_back(QPair<QString, QString>("Id устройства ввода", item->dynamicCall("DeviceID").toString()));
  64. vec.push_back(QPair<QString, QString>("Интерфейс устройства ввода", item->dynamicCall("DeviceInterface").toString()));
  65. vec.push_back(QPair<QString, QString>("Тип устройства ввода", item->dynamicCall("HardwareType").toString()));
  66.  
  67. item->deleteLater();
  68. }
  69. }
  70. objInterList->deleteLater();
  71. enumInterface->Release();
  72. }
  73.  
  74. return vec;
  75. }
  76.  
  77. bool SystemInfo::initializeItem(IEnumVARIANT *enumInterface)
  78. {
  79. VARIANT *theItem = (VARIANT*)malloc(sizeof(VARIANT));
  80. if (enumInterface->Next(1,theItem,NULL) == S_FALSE)
  81. return false;
  82.  
  83. item = new QAxObject((IUnknown*)theItem->punkVal);
  84. free(theItem);
  85. if (!item)
  86. {
  87. item->deleteLater();
  88. return false;
  89. }
  90. return true;
  91. }
  92.  
  93. IEnumVARIANT* SystemInfo::halfInitialize()
  94. {
  95. objInterList = objWMIService->querySubObject("ExecQuery(QString&))", query);
  96. if (!objInterList)
  97. return nullptr;
  98.  
  99. if (objInterList->dynamicCall("Count").toInt() == 0)
  100. return nullptr;
  101.  
  102. QAxObject *enum1 = objInterList->querySubObject("_NewEnum");
  103. if (!enum1)
  104. return nullptr;
  105.  
  106. IEnumVARIANT* enumInterface = 0;
  107. enum1->queryInterface(IID_IEnumVARIANT, (void**)&enumInterface);
  108.  
  109. enum1->deleteLater();
  110.  
  111. if (!enumInterface)
  112. return nullptr;
  113.  
  114. enumInterface->Reset();
  115. return enumInterface;
  116. }
  117.  
  118. if (initializeItem(enumInterface))
  119. {
  120. vec.push_back(QPair<QString, QString>("Имя устройства ввода", item->dynamicCall("Name").toString()));
  121. vec.push_back(QPair<QString, QString>("Описание устройства ввода", item->dynamicCall("Description").toString()));
  122. vec.push_back(QPair<QString, QString>("Id устройства ввода", item->dynamicCall("DeviceID").toString()));
  123. vec.push_back(QPair<QString, QString>("Интерфейс устройства ввода", item->dynamicCall("DeviceInterface").toString()));
  124. vec.push_back(QPair<QString, QString>("Тип устройства ввода", item->dynamicCall("HardwareType").toString()));
  125.  
  126. item->deleteLater();
  127. }
Add Comment
Please, Sign In to add comment