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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Чистый
Автор FAQ
2706 / 1402 / 73
Регистрация: 08.09.2011
Сообщений: 3,732
Записей в блоге: 1
#1

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

08.09.2011, 12:45. Просмотров 1063. Ответов 9
Метки нет (Все метки)

День добрый!
есть код:
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 не нравится?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2011, 12:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Код не работает как метод... (C++):

Код написан в Dev C. Не работает в Visual. Как нужно переделать код? - C++
Здравствуйте. Столкнулась с такой проблемой: код был написан в Dev C, но в Visual он выдаёт ошибку. ...

Мой код - метод бисекции, метод секущих (метод хорд) - C++
Всем привет!!! Изучаем в институте С++. Сделал код, и там, и там одна и та же проблема - при любых вбиваемых значениях программа делает...

Как работает метод Пузырька? - C++
Добрый день, господа... Делаю задание по сортировке массива... Нашел вот эту статью -...

Метод работает как то не понятно - C++
template &lt;typename TBase&gt; bool TArray &lt;TBase&gt;:: Addition (TBase s ) { ...

Как работает метод ignore - C++
Метод ignore удаляет один или несколько символов из области ввода, адрес которой задана первым параметром в методи getline.

как работает метод vec.clear() - C++
Вот я тут читаю книгу по stl библиотеку про вектора, списки, очереди. Тут у меня возник вопрос, помогите плиз. Есть допустим vector&lt;int&gt;...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
-=ЮрА=-
Заблокирован
Автор 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
0
Чистый
Автор FAQ
2706 / 1402 / 73
Регистрация: 08.09.2011
Сообщений: 3,732
Записей в блоге: 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?
0
-=ЮрА=-
Заблокирован
Автор FAQ
08.09.2011, 13:12 #4
CoInitialize(NULL); - она только с NULL идёт, попробуй CoInitializeEx (http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx), но лучше предоставь код на рассмотрение...
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
08.09.2011, 13:18 #5
Цитата Сообщение от Чистый Посмотреть сообщение
но не могу понять в чем проблема
RPC_E_TOO_LATE - CoInitializeSecurity has already been called.
Т.е. вызвана уже функция эта была.
0
Чистый
Автор FAQ
2706 / 1402 / 73
Регистрация: 08.09.2011
Сообщений: 3,732
Записей в блоге: 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.
Т.е. вызвана уже функция эта была.
не могу представить себе где функция может быть вызвана?
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
08.09.2011, 13:32 #7
Цитата Сообщение от Чистый Посмотреть сообщение
не могу представить себе где функция может быть вызвана?
Код ошибки утверждает, что уже вызвана. Кури доки по QT.
0
Чистый
Автор FAQ
2706 / 1402 / 73
Регистрация: 08.09.2011
Сообщений: 3,732
Записей в блоге: 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;
    }
но при таком раскладе метод не выводит размеры имеющихся винтов....
0
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 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 далеко не так хорошо заполнены как хотелось бы. Все зависит от производителей железа...
1
Чистый
Автор FAQ
2706 / 1402 / 73
Регистрация: 08.09.2011
Сообщений: 3,732
Записей в блоге: 1
13.09.2011, 14:49  [ТС] #10
Буду пробовать...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.09.2011, 14:49
Привет! Вот еще темы с ответами:

метод гауса..обьясните как работает программа - C++
ipMatr(); for(opMatr(),k=0;k&lt;=n;k++) //прямой ход метода Гаусса; {for(aa=fabs(a),i=k,j=k+1;j&lt;=n;j++)//поиск макс....

Подскажите метод, как вызывать get<n>(func)(x) n раз. Код внутри - C++
Создаю композитор функций с переменным числом параметров h(x,z) = f(x, g(g1(z),g2(z)),g11(z),...,gn(z)): template&lt;typename ... F&gt; ...

Как работает код - C++
С main вроде все понятно, а что дальше происходит? #include &lt;stdio.h&gt; int main(int t,int _,char*a) ...

Не понимаю, как работает код? - C++
int main(int argc, char** argv) //кол-во аргументов, указатель на массив указателей на сами аргументы. { setlocale( LC_ALL ,...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.09.2011, 14:49
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru