在vc下访问wmi的方法,网上很多。由于公司有的程序是用wmi去访问bios,所以,学习了点这方面的知识,很浅。 针对公司的程序,将方法记录下来。 #pragma once using namespace std; //device id #define DEVICE_ID_WLAN 0X00010011 #define DEVICE_ID_BLTH 0X00010013 #define DEVICE_ID_IRDA 0X00010023 #define DEVICE_ID_CAMARA 0X00060013 #define DEVICE_ID_GPS 0X00010015 #define DEVICE_ID_DISPLAY 0X00090011 #define DEVICE_ID_MODEM 0X00070011 #define DEVICE_ID_CARDREADER 0X00080013 #define DEVICE_ID_3G 0X00010019 #define DEVICE_ID_WIMAX 0X00010017 #define DEVICE_ID_RADIO 0X00060017 #define DEVICE_ID_BACKLIGHT 0X00050011 #define DEVICE_ID_PANELBRIGHTNESS 0X00050012 #define DEVICE_ID_TOUCHPAD 0X00100011 //#define DEVICE_id_SHE 0x00120000 struct WMIParameter{ LPCWSTR ArgName; VARIANT var; }; void MyInitCOM(); void MyUninitCOM(); void DebugPrint(const wchar_t *fmt); void DebugPrint(const wchar_t *fmt,HRESULT hr); class WmiAcpiWrapper { public: WmiAcpiWrapper(void); ~WmiAcpiWrapper(void); private: bool init; IWbemLocator *pLocator; IWbemServices *pNamespace; IWbemClassObject *pOutInst; IWbemClassObject *pInInst; int n_ObjNumber; BSTR* s_ObjectPath; BSTR s_ClassName; list<WMIParameter> l_Parameters; public: void Connect(const LPCWSTR& strNamespace); void Disconnect(); void AddInputParameter(const WMIParameter parameter); void AddInputParameter(const LPCWSTR& strParameterName ,const VARIANT& vParameterValue); void ClearParameters(); bool GetOutputParameter(const LPCWSTR& VariableName,VARIANT& vValue); IWbemClassObject* GetOutputObject(); HRESULT ExecuteMethod(const BSTR& OjectPath,const BSTR& sMethodName); ULONG SelectClass(const LPCWSTR& strClassName); BSTR GetObjectPath(int nCount); BOOL NotifyEventListening(const BSTR& Query,IWbemObjectSink *pDestSink); void Release(); }; HRESULT MethodDEVP(WmiAcpiWrapper *obj,UINT32 id,UINT32 ctrl,UINT32 *result); HRESULT MethodKBFT(WmiAcpiWrapper *obj,UINT32 value,UINT32 *result); HRESULT MethodDSTS(WmiAcpiWrapper *obj,UINT32 id,UINT32 *result); HRESULT MethodHKEY(WmiAcpiWrapper *obj,UINT32 *result); HRESULT MethodDEVS(WmiAcpiWrapper *obj,UINT32 id,UINT32 ctrl); HRESULT MethodHDPS(WmiAcpiWrapper *obj,UINT32 hdif,UINT32 *ctrl); HRESULT MethodSHE(WmiAcpiWrapper *obj,UINT32 value,UINT32 *result); 其中MethodXXX是用来读写WMI的。 HRESULT MethodDEVS(WmiAcpiWrapper *obj,UINT32 id,UINT32 ctrl) { HRESULT hr= S_OK; BSTR MethodName = NULL; VARIANT var; MethodName=SysAllocString(L"device_ctrl"); V_VT(&var) = VT_I4; V_I4(&var) = id; obj->AddInputParameter(L"device_id",var); VariantClear(&var); V_VT(&var) = VT_I4; V_I4(&var) = ctrl; obj->AddInputParameter(L"ctrl_param",var); VariantClear(&var); hr = obj->ExecuteMethod(obj->GetObjectPath(0),MethodName); SysFreeString(MethodName); return hr; } 一个方法的实现!