Russian Qt Forum

Программирование => Общий => Тема начата: Чистый от Сентябрь 07, 2011, 11:14



Название: Один и тот же код работает в 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.
Смутная догадка такая.