1 / 1 / 1
Регистрация: 29.09.2011
Сообщений: 57

Не работает WMI - ссылка на объект не указывает на экземпляр объекта

21.09.2012, 11:56. Показов 1692. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот код,взят из MSDN с небольшими "доработками":
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#pragma endregion
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                 HRESULT hres;
    // Step 1: --------------------------------------------------
    // Initialize COM. ------------------------------------------
    hres =  CoInitializeEx(0, COINIT_APARTMENTTHREADED);
    if (FAILED(hres)) MessageBox::Show("Step1 Error"); else MessageBox::Show("Step1 Passed");
    // Step 2: --------------------------------------------------
    // Set general COM security levels --------------------------
    // Note: If you are using Windows 2000, you need to specify -
    // the default authentication credentials for a user by using
    // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----
    // parameter of CoInitializeSecurity ------------------------
    hres =  CoInitializeSecurity(
        NULL, 
        -1,                          // COM authentication
        NULL,                        // Authentication services
        NULL,                        // Reserved
        RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication 
        RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation  
        NULL,                        // Authentication info
        EOAC_NONE,                   // Additional capabilities 
        NULL                         // Reserved
        );
    if (FAILED(hres)) MessageBox::Show("Step2 Error"); else MessageBox::Show("Step2 Passed");
    // Step 3: ---------------------------------------------------
    // Obtain the initial locator to WMI -------------------------
    IWbemLocator *pLoc = NULL;
       hres = CoCreateInstance(
        CLSID_WbemLocator,             
        0, 
        CLSCTX_INPROC_SERVER, 
        IID_IWbemLocator, (LPVOID *) &pLoc);
       if (FAILED(hres)) MessageBox::Show("Step3 Error"); else MessageBox::Show("Step3 Passed");
       // Step 4: -----------------------------------------------------
    // Connect to WMI through the IWbemLocator::ConnectServer method
 
    IWbemServices *pSvc = NULL;
    
    // Connect to the root\cimv2 namespace with
    // the current user and obtain pointer pSvc
    // to make IWbemServices calls.
    hres = pLoc->ConnectServer(
         BSTR(L"ROOT\\CIMV2"), // Object path of WMI namespace
         NULL,                    // User name. NULL = current user
         NULL,                    // User password. NULL = current
         0,                       // Locale. NULL indicates current
         NULL,                    // Security flags.
         0,                       // Authority (e.g. Kerberos)
         0,                       // Context object 
         &pSvc                    // pointer to IWbemServices proxy
         );
    if (FAILED(hres)) MessageBox::Show("Step4 Error"); else MessageBox::Show("Step4 Passed");
    // Step 5: --------------------------------------------------
    // Set security levels on the proxy -------------------------
 
    hres = CoSetProxyBlanket(
       pSvc,                        // Indicates the proxy to set
       RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
       RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
       NULL,                        // Server principal name 
       RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx 
       RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
       NULL,                        // client identity
       EOAC_NONE                    // proxy capabilities 
    );
    if (FAILED(hres)) MessageBox::Show("Step5 Error"); else MessageBox::Show("Step5 Passed");
        // Step 6: --------------------------------------------------
    // Use the IWbemServices pointer to make requests of WMI ----
 
    // For example, get the name of the operating system
    IEnumWbemClassObject* pEnumerator = NULL;
    hres = pSvc->ExecQuery(
        BSTR("WQL"), 
        BSTR("SELECT * FROM Win32_OperatingSystem"),
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
        NULL,
        &pEnumerator);
    if (FAILED(hres)) MessageBox::Show("Step6 Error"); else MessageBox::Show("Step6 Passed");
    // Step 7: -------------------------------------------------
    // Get the data from the query in step 6 -------------------
     IWbemClassObject *pclsObj;
    ULONG uReturn = 0;
    while (pEnumerator)
    {
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, 
            &pclsObj, &uReturn);
        if (FAILED(hres)) MessageBox::Show("Step7 Error"); else MessageBox::Show("Step7 Passed");
 
        if(0 == uReturn)
        {
            break;
        }
 
        VARIANT vtProp;
 
        // Get the value of the Name property
        hr = pclsObj->Get(BSTR(L"Name"), 0, &vtProp, 0, 0);
        label4->Text=System::Convert::ToString(vtProp.uintVal);
        //VariantClear(&vtProp);
    }
    // Cleanup
    // ========
    
    pSvc->Release();
    pLoc->Release();
  pEnumerator->Release();
    pclsObj->Release();
    CoUninitialize();
    // Следующая секция кода
}
Программа компилируется,линкуется,запускается - когда срабатывает кнопка то вылазит исключение.
Аналогично пробовал для кода WMI чтобы получить Caption диска - та же ошибка
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.09.2012, 11:56
Ответы с готовыми решениями:

Ссылка на объект не указывает на экземпляр объекта
В проге реализуется распарсивание строки и последующая обратная польская запись. При компиляции ошибок нет, но при работе парсинг работает,...

Ссылка на объект не указывает на экземпляр объекта
Здравствуйте. Пытаюсь взять строку из textBox1 и вывести на экран через messageBox. При выполнении выскакивает ошибка на строке 52. P.S....

Ссылка на объект не указывает на экземпляр объекта
Всем доброе времени суток! Помогите пожалуйста с этой ошибкой: "Ссылка на объект не указывает на экземпляр объекта." Ругается на любой...

2
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
21.09.2012, 12:02
Вот почитай статьи: http://www.codeproject.com/Art... rt-3-Hardw. А на C++/CLI переделай уж сам.
0
1 / 1 / 1
Регистрация: 29.09.2011
Сообщений: 57
21.09.2012, 18:58  [ТС]
У меня конкретно 1 строчка не работает:
hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
pclsObj не определен,из-за этого вылазит исключение. Все делал как в MSDN только пришлось:
1. переключить компилятор из CLR / pure в обычный CLR (не приклеивался хедер comdef.h)
2. заменить bstr_t на BSTR, чтобы линкер не вываливался с ошибкой debug.cpp

Добавлено через 5 часов 15 минут
Немного допилил код напильником,исправил ошибки:
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#pragma endregion
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                 HRESULT hres;
    BSTR param1 = SysAllocString(L"WQL");
    BSTR param2 = SysAllocString(L"SELECT * FROM Win32_OperatingSystem");
    BSTR param3 = SysAllocString(L"ROOT\\default");
    BSTR param4 = SysAllocString(L"Name");
    // Step 1: --------------------------------------------------
    // Initialize COM. ------------------------------------------
    hres =  CoInitializeEx(0, COINIT_APARTMENTTHREADED);
    if (FAILED(hres)) MessageBox::Show("Step1 Error"); else MessageBox::Show("Step1 Passed");
    // Step 2: --------------------------------------------------
    // Set general COM security levels --------------------------
    // Note: If you are using Windows 2000, you need to specify -
    // the default authentication credentials for a user by using
    // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----
    // parameter of CoInitializeSecurity ------------------------
    hres =  CoInitializeSecurity(
        NULL, 
        -1,                          // COM authentication
        NULL,                        // Authentication services
        NULL,                        // Reserved
        RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication 
        RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation  
        NULL,                        // Authentication info
        EOAC_NONE,                   // Additional capabilities 
        NULL                         // Reserved
        );
    if (FAILED(hres)) MessageBox::Show("Step2 Error"); else MessageBox::Show("Step2 Passed");
    // Step 3: ---------------------------------------------------
    // Obtain the initial locator to WMI -------------------------
    IWbemLocator *pLoc = NULL;
       hres = CoCreateInstance(
        CLSID_WbemLocator,             
        0, 
        CLSCTX_INPROC_SERVER, 
        IID_IWbemLocator, (LPVOID *) &pLoc);
       if (FAILED(hres)) MessageBox::Show("Step3 Error"); else MessageBox::Show("Step3 Passed");
       // Step 4: -----------------------------------------------------
    // Connect to WMI through the IWbemLocator::ConnectServer method
 
    IWbemServices *pSvc = NULL;
    
    // Connect to the root\cimv2 namespace with
    // the current user and obtain pointer pSvc
    // to make IWbemServices calls.
    hres = pLoc->ConnectServer(
         param3, // Object path of WMI namespace
         NULL,                    // User name. NULL = current user
         NULL,                    // User password. NULL = current
         0,                       // Locale. NULL indicates current
         NULL,                    // Security flags.
         0,                       // Authority (e.g. Kerberos)
         0,                       // Context object 
         &pSvc                    // pointer to IWbemServices proxy
         );
    if (FAILED(hres)) MessageBox::Show("Step4 Error"); else MessageBox::Show("Step4 Passed");
    // Step 5: --------------------------------------------------
    // Set security levels on the proxy -------------------------
 
    hres = CoSetProxyBlanket(
       pSvc,                        // Indicates the proxy to set
       RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
       RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
       NULL,                        // Server principal name 
       RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx 
       RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
       NULL,                        // client identity
       EOAC_NONE                    // proxy capabilities 
    );
    if (FAILED(hres)) MessageBox::Show("Step5 Error"); else MessageBox::Show("Step5 Passed");
        // Step 6: --------------------------------------------------
    // Use the IWbemServices pointer to make requests of WMI ----
 
    // For example, get the name of the operating system
    IEnumWbemClassObject* pEnumerator = NULL;
    hres = pSvc->ExecQuery(
        param1,param2,
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
        NULL,
        &pEnumerator);
    if (FAILED(hres)) MessageBox::Show("Step6 Error"); else MessageBox::Show("Step6 Passed");
    // Step 7: -------------------------------------------------
    // Get the data from the query in step 6 -------------------
     IWbemClassObject *pclsObj;
    ULONG uReturn = 0;
    while (pEnumerator)
    {
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, 
            &pclsObj, &uReturn);
        if (FAILED(hres)) MessageBox::Show("Step7 Error"); else MessageBox::Show("Step7 Passed");
 
        VARIANT vtProp;
        VariantInit(&vtProp);
        CIMTYPE cimType;
 
        // Get the value of the Name property
        hr = pclsObj->Get(L"Name", 0, &vtProp, &cimType, 0);
        _ASSERTE(cimType == CIM_FLAG_ARRAY | CIM_STRING);
        label4->Text=System::Convert::ToString(vtProp.uintVal);
        VariantClear(&vtProp);
    }
    // Cleanup
    // ========
    
    pSvc->Release();
    pLoc->Release();
  pEnumerator->Release();
//    pclsObj->Release();
    CoUninitialize();
    // Следующая секция кода
Выдает ошибку "чтение\запись в защищенную область памяти. возможно память повреждена"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.09.2012, 18:58
Помогаю со студенческими работами здесь

Ссылка на объект не указывает на экземпляр объекта
Здравствуйте. Помогите пожалуйста с ошибкой, не имею понятия что с ней делать. Программу делаю в visual studio 2017 используя windows form....

Ссылка на объект не указывает на экземпляр объекта
Всем привет, проблемка возникла. В общем задача подключить базу кнопкой к gridview и потом обновить базу нажатием другой кнопки, но при...

SystemDrawing не рисует в форме - Ссылка на объект не указывает на экземпляр объекта
Всем привет, в общем такая проблема: При выполнении приложения выдает следующее: Необработанное исключение типа...

Ошибка: "Ссылка на объект не указывает на экземпляр объекта"
Ребят, пишу первую программу в WinForms. Подскажите, пожалуйста в чем ошибка. Компилятор не ругается, а после запуска выдаётся ошибка...

Ссылка на объект не указывает на экземпляр объекта
Пытаюсь написать сокетный чат. Что я делаю не правильно? public: void ThreadStartfnc() { while (Status != 1 &&...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

Новые блоги и статьи
Анализ и линтинг кода JavaScript: ESLint, Prettier и JSHint
run.dev 26.04.2025
JavaScript прошёл долгий путь от простого языка для анимации веб-страниц до основы современной веб-разработки. С ростом сложности приложений, увеличением кодовых баз и масштабированием команд. . .
Паттерны в Python: Singleton, Factory и Observer
py-thonny 26.04.2025
Паттерны проектирования — это проверенные временем решения типовых проблем разработки программного обеспечения. Их история берёт начало с книги "Приёмы объектно-ориентированного проектирования. . . .
Исключения в C#: Stack Overflow, Access Violation и Out of memory
stackOverflow 26.04.2025
Исключения в C# — это не только механизм оповещения о проблемах, а целое искусство управления потоком выполнения программы в экстремальных ситуациях. Обычное исключение, например,. . .
Логирование в C# ASP.NET Core с помощью Serilog, ElasticSearch, Kibana
stackOverflow 25.04.2025
Помните те времена, когда для анализа проблемы приходилось подключаться к серверу, искать нужный лог-файл среди десятков других и вручную фильтровать тысячи строк в поисках ошибки? К счастью, эти дни. . .
Структура "железный OnKeyUp" вместо антидребезга. Полностью асинхронный счётчик.
Hrethgir 25.04.2025
Программа для симуляции схемы - Logisim Evolution В общем какое-то время отвлёкся, так было надо, теперь когда запилю это на verilog и FPGA , досоставлю заявку в ФИПС на полезную модель - не готов. . .
Автоматизация Amazon Web Services (AWS) с Boto3 в Python
py-thonny 25.04.2025
Облачные вычисления стали неотъемлемой частью современной ИТ-инфраструктуры, а Amazon Web Services (AWS) занимает лидирующие позиции среди провайдеров облачных услуг. Управление многочисленными. . .
Apache Kafka vs RabbitMQ в микросервисной архитектуре
ArchitectMsa 25.04.2025
Современная разработка ПО всё чаще склоняется к микросервисной архитектуре — подходу, при котором приложение разбивается на множество небольших, автономных сервисов. В этой распределённой среде. . .
Параллельное программирование с OpenMP в C++
NullReferenced 24.04.2025
Параллельное программирование — подход к созданию программ, когда одна задача разбивается на несколько подзадач, которые могут выполняться одновременно. Оно стало необходимым навыком для. . .
Цепочки методов в C# с Fluent API
UnmanagedCoder 24.04.2025
Современное программирование — это не только решение функциональных задач, но и создание кода, который удобно поддерживать, расширять и читать. Цепочки методов и Fluent-синтаксис в C# стали мощным. . .
Мульти-тенантные БД с PostgreSQL Row Security
Codd 23.04.2025
Современные облачные сервисы и бизнес-приложения всё чаще обслуживают множество клиентов в рамках единой программной инфраструктуры. Эта архитектурная модель, известная как мульти-тенантность, стала. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru