Название: Один и тот же код работает в VS 2008 Express не работает в Qt Creator
Отправлено: Чистый от Сентябрь 07, 2011, 11:14
День добрый! Есть вот такой код: CoInitialize(NULL);
if(CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0) != S_OK) { qDebug() << "Error: CoInitialize"; return 1;}
IWbemLocator * pIWbemLocator = NULL; IWbemServices * pWbemServices = NULL; IEnumWbemClassObject * pEnumObject = NULL;
BSTR bstrNamespace = (L"root\\cimv2");
if(CoCreateInstance (CLSID_WbemAdministrativeLocator, NULL , CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER , IID_IUnknown ,( void ** ) & pIWbemLocator ) != S_OK) {return 1;} if(pIWbemLocator->ConnectServer(bstrNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) != S_OK) { qDebug() << "Error: ConnectServer"; return 1;}
HRESULT hRes; BSTR strQuery = (L"Select * from win32_diskdrive"); BSTR strQL = (L"WQL"); hRes = pWbemServices->ExecQuery(strQL, strQuery,WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumObject); IWbemClassObject * pClassObject = NULL; VARIANT v; if(hRes != S_OK) { qDebug() <<"Could not execute Query"; return 1; } else { ULONG uCount = 1, uReturned; hRes = pEnumObject->Reset();
if(hRes != S_OK) { qDebug() <<"Could not Enumerate"; return 1; } while (pEnumObject) { hRes = pEnumObject->Next(WBEM_INFINITE,uCount, &pClassObject, &uReturned); if(uReturned==0) { qDebug() << "End"; return 1 ; } BSTR strClassProp = SysAllocString(L"Size"); hRes = pClassObject->Get(strClassProp, 0, &v, 0, 0); if(hRes != S_OK) { qDebug() << "Could not Get Value"; return 1; }
SysFreeString(strClassProp); _bstr_t bstrPath = &v; //Just to convert BSTR to ANSI char* strPath=(char*)bstrPath; if (SUCCEEDED(hRes)) { qDebug() << strPath << endl; } else qDebug() << "Error in getting object"; } } VariantClear( &v ); pIWbemLocator->Release(); pWbemServices->Release(); pEnumObject->Release(); pClassObject->Release(); CoUninitialize(); return 0;
проблема в том что код этот компилируется и там и там, но вот работает только в VS 2008 Express при этом при компиляции в Qt Creator нет ни ошибок ни предупреждений, но при попытке выполнить код не проходит первое условие :( что нет подскажите...
Название: Re: Один и тот же код работает в VS 2008 Express не работает в Qt Creator
Отправлено: Vass от Сентябрь 07, 2011, 12:44
CoInitializeSecurity надо показать
Название: Re: Один и тот же код работает в VS 2008 Express не работает в Qt Creator
Отправлено: Чистый от Сентябрь 07, 2011, 12:56
CoInitializeSecurity надо показать
не понял...
Название: Re: Один и тот же код работает в VS 2008 Express не работает в Qt Creator
Отправлено: SeverusSnape от Сентябрь 07, 2011, 13:05
это ж винапи
Название: Re: Один и тот же код работает в VS 2008 Express не работает в Qt Creator
Отправлено: Чистый от Сентябрь 07, 2011, 13:11
это ж винапи
вот и я не понял что показывать в коде все предельно ясно :( он не везде работает :( UPD:Только что создал новый проект, вставил код, откомпилил, проверил - работает... надо смотреть что я намутил с вызовом этой функции... странно как-то...
Название: Re: Один и тот же код работает в VS 2008 Express не работает в Qt Creator
Отправлено: Чистый от Сентябрь 07, 2011, 14:10
Ребят помогите разобраться что-то все равно не пашет :( есть файл infohard.h C++ (Qt) #ifndef INFOHARD_H #define INFOHARD_H #include <QObject> #include <QString> #include <QMainWindow> #include <QMessageBox> #include <QDebug> #include <iostream> #ifdef Q_OS_WIN32 #pragma once #define _WIN32_DCOM #include <wbemidl.h> #include <comdef.h> #include <conio.h> #pragma comment(lib, "wbemuuid.lib") #endif using namespace std; class InfoHard : public QObject { Q_OBJECT public: explicit InfoHard(QObject *parent = 0); signals: public slots: int sl_GetInfo(); };
есть файл infohard.cpp C++ (Qt) #include "infohard.h" InfoHard::InfoHard(QObject *parent) : QObject(parent) { } int InfoHard::sl_GetInfo() { CoInitialize(NULL); if(CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0) != S_OK) { qDebug() << "Error: CoInitialize"; return 1;} IWbemLocator * pIWbemLocator = NULL; IWbemServices * pWbemServices = NULL; IEnumWbemClassObject * pEnumObject = NULL; BSTR bstrNamespace = (L"root\\cimv2"); if(CoCreateInstance (CLSID_WbemAdministrativeLocator, NULL , CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER , IID_IUnknown ,( void ** ) & pIWbemLocator ) != S_OK) {return 1;} if(pIWbemLocator->ConnectServer( bstrNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices ) != S_OK) { qDebug() << "Error: ConnectServer"; return 1;} HRESULT hRes; BSTR strQuery = (L"Select * from win32_diskdrive"); BSTR strQL = (L"WQL"); hRes = pWbemServices->ExecQuery(strQL, strQuery,WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumObject); IWbemClassObject * pClassObject = NULL; VARIANT v; if(hRes != S_OK) { qDebug() <<"Could not execute Query"; return 1; } else { ULONG uCount = 1, uReturned; hRes = pEnumObject->Reset(); if(hRes != S_OK) { qDebug() <<"Could not Enumerate"; return 1; } while (pEnumObject) { hRes = pEnumObject->Next(WBEM_INFINITE,uCount, &pClassObject, &uReturned); if(uReturned==0) { qDebug() << "End"; return 1 ; } BSTR strClassProp = SysAllocString(L"Size"); hRes = pClassObject->Get(strClassProp, 0, &v, 0, 0); if(hRes != S_OK) { qDebug() << "Could not Get Value"; return 1; } SysFreeString(strClassProp); _bstr_t bstrPath = &v; //Just to convert BSTR to ANSI char* strPath=(char*)bstrPath; if (SUCCEEDED(hRes)) { qDebug() << strPath << endl; } else qDebug() << "Error in getting object"; } } VariantClear( &v ); pIWbemLocator->Release(); pWbemServices->Release(); pEnumObject->Release(); pClassObject->Release(); CoUninitialize(); return 0; }
и есть файл Stuff.cpp из которого я и пытаюсь вызвать sl_GetInfo из файла infohard вот так: C++ (Qt) inf = new InfoHard; connect(ui->cmdSaveSettings, SIGNAL(clicked()), inf, SLOT(sl_GetInfo()));
что не так я делаю? где туплю? при таком раскладе все равно не проходит первое условие :(
Название: Re: Один и тот же код работает в VS 2008 Express не работает в Qt Creator
Отправлено: Странник от Сентябрь 07, 2011, 15:53
так а CoInitializeSecurity что возвращает? возможно, RPC_E_TOO_LATE?
Название: Re: Один и тот же код работает в VS 2008 Express не работает в Qt Creator
Отправлено: Чистый от Сентябрь 08, 2011, 09:01
так а CoInitializeSecurity что возвращает? возможно, RPC_E_TOO_LATE?
вот это оно возвращает -2147417831
Название: Re: Один и тот же код работает в VS 2008 Express не работает в Qt Creator
Отправлено: LisandreL от Сентябрь 08, 2011, 09:58
вот это оно возвращает -2147417831 (80010106) Cannot change thread mode after it is set. Не ваш случай, но может поможет понять, в чём проблема: http://stackoverflow.com/questions/2453973/using-dll-that-using-com-in-c
Название: Re: Один и тот же код работает в VS 2008 Express не работает в Qt Creator
Отправлено: Чистый от Сентябрь 08, 2011, 11:11
вот это оно возвращает -2147417831 (80010106) Cannot change thread mode after it is set. Не ваш случай, но может поможет понять, в чём проблема: http://stackoverflow.com/questions/2453973/using-dll-that-using-com-in-c так если строки убрать из метода то метод не работает, компиляция проходит без проблем, но и метод не выполняет возложенные на него функции т.е. он не находи ни одного винта, а должен... блин совсем косяк какой-то :( либо лыжи не едут либо я ....
Название: Re: Один и тот же код работает в VS 2008 Express не работает в Qt Creator
Отправлено: fzt от Ноябрь 11, 2011, 16:56
BSTR bstrNamespace = (L"root\\cimv2"); попробуй без L. Смутная догадка такая.
|