Название: qt wmi опрос системных счетчиков, cpu, ram, hdd и т.д.(не мануал, но подсказка) Отправлено: 28515 от Февраль 23, 2015, 17:15 Не знал куда тему запихнуть, может кому поможет. К сожалению обнаружил, что вопрос до сих пор актуален (особенно у начинающих). Сразу скажу я не гуру, и не претендую...да и просто пофиг. И так, в инете есть одна статья в которой почти все разжевано https://poofeg.ru/2010/06/wmi-i-qt-problemy-s-ienum/ (https://poofeg.ru/2010/06/wmi-i-qt-problemy-s-ienum/), но вопросы почему-то у многих остаются. Понадобится - WMI Code Creator v1.0 http://www.microsoft.com/en-us/download/details.aspx?id=8572 (http://www.microsoft.com/en-us/download/details.aspx?id=8572). Давайте получим модель проца. В WMI Creator-е выбираем пространство имен root\CIMV2 (почти все что вам понадобится, находится в этом пространстве) выбираем класс Win32_Processor, свойство Name, нажимаем Execute Code - все работает, идем дальше. Собственно сам код(из статьи - могут быть очепятки):
Код: QAxObject *objIWbemLocator = new QAxObject("WbemScripting.SWbemLocator"); Инклуды: Код: #include <QAxObject> pro: Код: QT += axcontainer Код: HRESULT hr = CoInitialize(0); Сишный код свою часть перекрывает, а wmi нет - если будет исключение в wmi (а оно точно будет) - будет плохо. Поэтому создаем слот, что то вроде: Код: void outputLogError(int num, QString one, QString two, QString three); Код: connect(objIWbemLocator, SIGNAL(exception(int,QString,QString,QString)), this, SLOT(outputLogError(int,QString,QString,QString))); И самое главное WMI не панацея, и частенько пиз**т, проверено. Столкнулся с утечкой памяти. Чуть мозг не потек. Долго грешил на QAxObject. Опытным путем установил, что память утекала вот тут Код: IEnumVARIANT* enumInterface = 0; Цитировать ... but the object won't be released from memory at that point because enumInterface (в моём случае) is still holding a reference to it. When enumInterface->Release(); is called, the ref count will go to 0 and the object will be released. If you omit the enumInterface->Release(); then the enumInterface->Release(); will not free the object and you will have a memory leak in your process. Надеюсь это кому-нибудь спасёт пару кило нервов и сэкономит пару часов(суток) времени. |