WMI und so ...



  • Hallo wiedermal!

    Kennt sich vielleicht jemand mit WMI - Klassen aus?
    Bzw. wie ich CIM - Klassen in meinem Projekt verwende.
    *
    Laut MSDN:
    Header: Declared in Cimwin32.mof.
    Namespace: Included in \root\cimv2.
    *
    Weiß jetzt nur nicht, wie ich das in mein Projekt einbinde. -> ?
    Kann mir jemand helfen?



  • Weiß jetzt nur nicht, wie ich das in mein Projekt einbinde. -> ?

    Also ich habe in meinem Test-Projektchen einfach nur wbemdisp.h inkludiert und wbemuuid.lib hinzugefügt. Der Rest läuft da einfach über die COM-Schnittstellen.

    Ich kenne mich aber mit diesem Thema nicht aus; ich habe mich eben, angeregt durch Deine Frage, zum ersten Mal damit beschäftigt. Vielleicht hast Du ganz was anderes vor als ich es eben gemacht habe (ich habe mir einfach Infos über den Processor anzeigen lassen, mehr nicht).



  • Das klingt nicht schlecht, was du da hast! Hast du vielleicht ein kleines Testbeispiel für mich? Wär super!



  • Als Beispiel habe ich nur das, was ich da vorhin gemacht habe. Die Betonung liegt auf klein.

    // wbemuuid.lib nicht vergessen!
    #include <windows.h>
    #include <tchar.h>
    #include <wbemdisp.h>
    
    int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
    {
      ISWbemObjectSet* pObjectSet = NULL;
      ISWbemServices*  pServices  = NULL;
      ISWbemObject*    pObject    = NULL;
      IEnumVARIANT*    pEnumObj   = NULL;
      IUnknown*        pUnk       = NULL;
      VARIANT          varItem;
      HRESULT          hr;
      BSTR             bstrClass, bstrName;
    
        CoInitialize(NULL);
    
        if(SUCCEEDED(CoGetObject(OLESTR("winmgmts:"), NULL, IID_ISWbemServices, (void**)&pServices)))
        {
            bstrClass = SysAllocString(OLESTR("Win32_Processor"));
    
            if(SUCCEEDED(pServices->InstancesOf(bstrClass, 0, NULL, &pObjectSet)))
            {
                if(SUCCEEDED(pObjectSet->get__NewEnum(&pUnk)))
                {
                    if(SUCCEEDED(pUnk->QueryInterface(IID_IEnumVARIANT, (void**)&pEnumObj)))
                    {
                        while(S_OK == pEnumObj->Next(1, &varItem, NULL))
                        {
                            if(FAILED(VariantChangeType(&varItem, &varItem, 0, VT_UNKNOWN)))
                            {
                                VariantClear(&varItem);
                                continue;
                            }
    
                            pObject = NULL;                        
                            hr = V_UNKNOWN(&varItem)->QueryInterface(IID_ISWbemObject, (void**)&pObject);
                            VariantClear(&varItem);
    
                            if(FAILED(hr))
                                continue;
    
                            bstrName = NULL;
                            pObject->GetObjectText_(0, &bstrName);
    
                            MessageBoxW(NULL, bstrName, L"Processor Info", MB_OK);
    
                            SysFreeString(bstrName);
                            pObject->Release();
                        }
                        pEnumObj->Release();
                    }
                    pUnk->Release();
                }
                pObjectSet->Release();
            }
            SysFreeString(bstrClass);
            pServices->Release();
        }
    
        CoUninitialize();
        return(0);
    }
    


  • Hallo nochmal und danke vorab.
    Wollt dein Programm testen, doch mein Compiler meldet 37 Fehler Meldungen wie z.B.:
    ...\microsoft sdk\include\rpcndr.h(602) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'MaxCount'
    ...\microsoft sdk\include\rpcndr.h(602) : error C2501: 'ULONG_PTR' : Fehlende Speicherklasse oder Typbezeichner

    Weißt du, was da los sein kann?



  • Das hört sich nach 'nem alten PSDK an, Du solltest das mal updaten.



  • Das Beispiel ist echt super. Aber wo bekomme ich die wbemdisp.h her?


Anmelden zum Antworten