Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > Вопрос по WMI.


Автор: AndreySol 2.11.2005, 07:47
Есть такой код:
Код

CoInitialize (NULL);
CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_CONNECT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
HRESULT hr = 0;
IWbemLocator *pWbemLocator = NULL;
if(SUCCEEDED(hr = CoCreateInstance (CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (void**) &pWbemLocator)))
{       
    IWbemServices *pServices = NULL;
    if(SUCCEEDED(hr = pWbemLocator->ConnectServer(_bstr_t(L"root\\cimv2"), NULL, NULL, NULL, 0, NULL, NULL, &pServices)))
    {
        IEnumWbemClassObject * pEnum = NULL;
        hr = pServices->CreateInstanceEnum(_bstr_t(L"Win32_CDROMDrive"), 0, NULL, &pEnum);
        if(pEnum)
        {
            ULONG uReturned = 1;
            while(uReturned == 1)
            {
                IWbemClassObject * pClassObject = NULL;
                hr = pEnum->Next(7000, 1, &pClassObject, &uReturned);
                if (SUCCEEDED(hr) && (uReturned == 1))
                {
                    // получаем текстовое значение "Caption"
                    VARIANT v;
                    VariantInit(&v);
                    CIMTYPE vtType = CIM_STRING;
                    LONG lFlavor = 0L;
                    pClassObject->Get (L"Caption", 0, &v, &vtType, &lFlavor);
                    if(v.vt == VT_BSTR)
                    {
                        WCHAR buf[1024] = L"";
                        DWORD dwLen = *((DWORD*)v.bstrVal - 1)/sizeof(WCHAR);
                        wcsncpy(buf, v.bstrVal, dwLen); 
                        *(buf + dwLen) = L'\0';
                        ::MessageBoxW (0, buf, L"", MB_OK);
                    }

                    // получаем числовое значение "FileSystemFlagsEx"
                    VariantClear(&v);
                    VariantInit(&v);
                    vtType = CIM_SINT32;
                    pClassObject->Get(L"FileSystemFlagsEx", 0, &v, &vtType, &lFlavor);
                    if(v.vt == VT_UINT)
                    {
                        CString res = "";
                        res.Format("%u", v.ullVal);
                        MessageBox(res, "", MB_OK);
                    }
                    VariantClear(&v);
                    pClassObject->Release ();
                }
            }//end while

            pEnum->Release ();
        }
        pServices->Release ();
    }
    pWbemLocator->Release ();
}
CoUninitialize ();

Для текстовых значений все нормально, а числовые не могу получить.
Помогите кто разобрался с этим, запарился уже.

Автор: AndreySol 4.11.2005, 07:50
Ну что же молчим ?
Че никто с WMI не работал ?

Автор: p0s0l 15.11.2005, 15:15
Код

// в объявлении класса Win32_CDROMDrive свойство FileSystemFlagsEx имеет тип uint32,
// поэтому целесообразнее запрашивать беззнаковое значение
                    vtType = CIM_UINT32;

                    pClassObject->Get(L"FileSystemFlagsEx", 0, &v, &vtType, &lFlavor);

// но почему-то WMI всё равно возвращает знаковое значение... :(
// поэтому проверка типа будет VT_I4
                    if(v.vt == VT_I4)    
                    {    
                        CString res = "";    
                        res.Format("%d", v.lVal);
                        MessageBox(res, "", MB_OK);    
                    }

Добавлено @ 15:16
Также убедись, что в CD-ROM вставлен диск smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)