Форум программистов, компьютерный форум CyberForum.ru

Код не работает как метод... - C++

Восстановить пароль Регистрация
 
Чистый
Автор FAQ
 Аватар для Чистый
2572 / 1379 / 70
Регистрация: 08.09.2011
Сообщений: 3,705
Записей в блоге: 1
08.09.2011, 12:45     Код не работает как метод... #1
День добрый!
есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
    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;
при вызове данного кода как метода класса, не проходит первое условие, CoInitializeSecurity возвращает -2147417831 ... Пробовал создать проект на основе этого кода тогда код работает... подскажите что CoInitializeSecurity не нравится?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
08.09.2011, 12:51     Код не работает как метод... #2
Цитата Сообщение от Чистый Посмотреть сообщение
CoInitializeSecurity
проверь верность аргументов http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Ну и вот на msdn-е обсуждали 9думаю ссылка туда не запрещена правилами нашего форума)
http://social.msdn.microsoft.com/For...5-0b9c8175246c
Чистый
Автор FAQ
 Аватар для Чистый
2572 / 1379 / 70
Регистрация: 08.09.2011
Сообщений: 3,705
Записей в блоге: 1
08.09.2011, 12:57  [ТС]     Код не работает как метод... #3
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
проверь верность аргументов http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Ну и вот на msdn-е обсуждали 9думаю ссылка туда не запрещена правилами нашего форума)
http://social.msdn.microsoft.com/For...5-0b9c8175246c
Ссылки что вы дали я уже читал...
Я конечно может и не прав, но если бы проблема была с аргументами, то код бы не работал как проект, т.е. если создать файл main.cpp подключить необходимые заголовочные файлы и вставить этот же код он отработает как надо... если же делать вызов кода как метод класса вылазит этот косяк подозреваю что
проблема с
C++
1
CoInitialize(NULL);
но не могу понять в чем проблема, может код должен отрабатывать до кода в функции main?
-=ЮрА=-
Заблокирован
Автор FAQ
08.09.2011, 13:12     Код не работает как метод... #4
CoInitialize(NULL); - она только с NULL идёт, попробуй CoInitializeEx (http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx), но лучше предоставь код на рассмотрение...
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
08.09.2011, 13:18     Код не работает как метод... #5
Цитата Сообщение от Чистый Посмотреть сообщение
но не могу понять в чем проблема
RPC_E_TOO_LATE - CoInitializeSecurity has already been called.
Т.е. вызвана уже функция эта была.
Чистый
Автор FAQ
 Аватар для Чистый
2572 / 1379 / 70
Регистрация: 08.09.2011
Сообщений: 3,705
Записей в блоге: 1
08.09.2011, 13:27  [ТС]     Код не работает как метод... #6
так наверно надо все предоставить а не чистый код метода! И так есть файлы
infohard.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#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);
public slots:
    int sl_GetInfo();
};
#endif // INFOHARD_H
есть файл infohard.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#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,  // Namespace
            NULL,          // Userid
            NULL,           // PW
            NULL,           // Locale
            0,              // flags
            NULL,           // Authority
            NULL,           // Context
            &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;
  
    int k=0;
    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 из которого я вызываю метот вот таким способом (тут чистое Qt)
C++
1
2
inf = new InfoHard;
connect(ui->cmdSaveSettings, SIGNAL(clicked()), inf, SLOT(sl_GetInfo()));
вот это все что касается данного кода...

Добавлено через 36 секунд
Цитата Сообщение от Deviaphan Посмотреть сообщение
RPC_E_TOO_LATE - CoInitializeSecurity has already been called.
Т.е. вызвана уже функция эта была.
не могу представить себе где функция может быть вызвана?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
08.09.2011, 13:32     Код не работает как метод... #7
Цитата Сообщение от Чистый Посмотреть сообщение
не могу представить себе где функция может быть вызвана?
Код ошибки утверждает, что уже вызвана. Кури доки по QT.
Чистый
Автор FAQ
 Аватар для Чистый
2572 / 1379 / 70
Регистрация: 08.09.2011
Сообщений: 3,705
Записей в блоге: 1
08.09.2011, 20:41  [ТС]     Код не работает как метод... #8
Цитата Сообщение от Deviaphan Посмотреть сообщение
Код ошибки утверждает, что уже вызвана. Кури доки по QT.
тогда получается что я могу просто отключить строки:
C++
1
2
3
4
5
6
7
8
  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;
    }
но при таком раскладе метод не выводит размеры имеющихся винтов....
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
13.09.2011, 13:35     Код не работает как метод... #9
Чистый,
Как я понял из MSDN это косяк WMI, поидее это должно решаться вызовом WMI в отдельном потоке, но мне лень было с этим мучиться, поэтому решение получилось такое:
C++
1
2
3
4
5
CoUninitialize();
hres = CoInitializeEx(0,COINIT_MULTITHREADED);
hres = CoInitializeEx(0,COINIT_MULTITHREADED);
hres = CoInitializeSecurity(NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL);             
    if (FAILED(hres)){  CoUninitialize();   return "";  }
То есть сначала делаю деинициализацию, это спасает от некоторых глюков.
Потом два раза CoInitializeEx без проверки ошибки, так как ошибка будет, но все инициализируется правильно, а потом уже все в соответствии с MSDN.
И без
C++
1
pclsObj->Release();
в конце, в Qt почему то на нем ошибка выскакивает.

Добавлено через 10 минут
Чистый, Ну и учитывай структуры WMI далеко не так хорошо заполнены как хотелось бы. Все зависит от производителей железа...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.09.2011, 14:49     Код не работает как метод...
Еще ссылки по теме:

C++ Объясните как работает код
C++ Как работает код
Метод работает как то не понятно C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Чистый
Автор FAQ
 Аватар для Чистый
2572 / 1379 / 70
Регистрация: 08.09.2011
Сообщений: 3,705
Записей в блоге: 1
13.09.2011, 14:49  [ТС]     Код не работает как метод... #10
Буду пробовать...
Yandex
Объявления
13.09.2011, 14:49     Код не работает как метод...
Ответ Создать тему
Опции темы

Текущее время: 19:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru