Russian Qt Forum
Ноябрь 12, 2024, 05:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Один и тот же код работает в VS 2008 Express не работает в Qt Creator  (Прочитано 6927 раз)
Чистый
Гость
« : Сентябрь 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 нет ни ошибок ни предупреждений, но при попытке выполнить код не проходит первое условие Грустный что нет подскажите...
Записан
Vass
Гость
« Ответ #1 : Сентябрь 07, 2011, 12:44 »

CoInitializeSecurity надо показать
Записан
Чистый
Гость
« Ответ #2 : Сентябрь 07, 2011, 12:56 »

CoInitializeSecurity надо показать
не понял...
Записан
SeverusSnape
Гость
« Ответ #3 : Сентябрь 07, 2011, 13:05 »

это ж винапи
Записан
Чистый
Гость
« Ответ #4 : Сентябрь 07, 2011, 13:11 »

это ж винапи
вот и я не понял что показывать в коде все предельно ясно Грустный он не везде работает Грустный

UPD:
Только что создал новый проект, вставил код, откомпилил, проверил - работает... надо смотреть что я намутил с вызовом этой функции... странно как-то...
« Последнее редактирование: Сентябрь 07, 2011, 13:42 от Чистый » Записан
Чистый
Гость
« Ответ #5 : Сентябрь 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()));
 
что не так я делаю? где туплю? при таком раскладе все равно не проходит первое условие Грустный
« Последнее редактирование: Сентябрь 07, 2011, 14:16 от Чистый » Записан
Странник
Гость
« Ответ #6 : Сентябрь 07, 2011, 15:53 »

так а CoInitializeSecurity что возвращает? возможно, RPC_E_TOO_LATE?
Записан
Чистый
Гость
« Ответ #7 : Сентябрь 08, 2011, 09:01 »

так а CoInitializeSecurity что возвращает? возможно, RPC_E_TOO_LATE?
вот это оно возвращает -2147417831
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #8 : Сентябрь 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
Записан
Чистый
Гость
« Ответ #9 : Сентябрь 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
так если строки убрать из метода то метод не работает, компиляция проходит без проблем, но и метод не выполняет возложенные на него функции т.е. он не находи ни одного винта, а должен... блин совсем косяк какой-то Грустный либо лыжи не едут либо я ....
Записан
fzt
Гость
« Ответ #10 : Ноябрь 11, 2011, 16:56 »

BSTR bstrNamespace = (L"root\\cimv2");
попробуй без L.
Смутная догадка такая.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.339 секунд. Запросов: 23.