WMI简单封装(Win32, C++)

CWmiUtils.h

#pragma once
#include <Wbemidl.h>
#include <functional>

#include <string>
#include <vector>
#include <tchar.h>

#ifdef _UNICODE
using _tstring = std::wstring;
#else
using _tstring = std::string;
#endif

class CWmiUtils
{
public:

	CWmiUtils();
	~CWmiUtils();

	bool Initialize();
	void Uninitialize();
	bool Query(LPCTSTR lpSql, std::function<void(IWbemClassObject *pclsObj)> mb);

    static _tstring GetVariantString(IWbemClassObject* pclsObj, LPCTSTR lpValueName);
    static LONG GetVariantLong(IWbemClassObject* pclsObj, LPCTSTR lpValueName);
    static SHORT GetVariantShort(IWbemClassObject* pclsObj, LPCTSTR lpValueName);
    static BOOL GetVariantBool(IWbemClassObject* pclsObj, LPCTSTR lpValueName);
    static INT64 GetVariantInt64(IWbemClassObject* pclsObj, LPCTSTR lpValueName);
    static INT8 GetVariantUInt8(IWbemClassObject* pclsObj, LPCTSTR lpValueName);
    static std::vector<_tstring> GetStrArray(IWbemClassObject* pclsObj, LPCTSTR lpValueName);
    static std::vector<short> GetShortArray(IWbemClassObject* pclsObj, LPCTSTR lpValueName);
private:
	bool m_isInit;
	IWbemServices* m_pSvc;
	IWbemLocator* m_pLoc;
};

CWmiUtils.cpp

#include "CWmiUtils.h"
#include <comdef.h>
#include <Wbemidl.h>
#include <tchar.h>
#include <strsafe.h>

#pragma comment(lib, "wbemuuid.lib")

CWmiUtils::CWmiUtils():
	m_pSvc(NULL),
	m_pLoc(NULL),
    m_isInit(false)
{

}

CWmiUtils::~CWmiUtils()
{

}

bool CWmiUtils::Initialize()
{
	HRESULT hres = S_OK;

	if (m_isInit)
	{
		return true;
	}

	hres = CoInitializeEx(0, COINIT_MULTITHREADED);
	if (FAILED(hres))
	{
		return false;
	}

	//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))
	{
		goto L_Cleanup;
	}

	hres = CoCreateInstance(
		CLSID_WbemLocator,
		0,
		CLSCTX_INPROC_SERVER,
		IID_IWbemLocator, (LPVOID*)&m_pLoc);

	if (FAILED(hres))
	{
		goto L_Cleanup;
	}

	hres = m_pLoc->ConnectServer(
		_bstr_t(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 (for example, Kerberos)
		0,                       // Context object 
		&m_pSvc                    // pointer to IWbemServices proxy
	);

	if (FAILED(hres))
	{
		goto L_Cleanup;
	}

	hres = CoSetProxyBlanket(
		m_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))
	{
		goto L_Cleanup;
	}

	m_isInit = true;

L_Cleanup:

	if (!m_isInit)
	{
		if (m_pSvc)
		{
			m_pSvc->Release();
			m_pSvc = NULL;
		}

		if (m_pLoc)
		{
			m_pLoc->Release();
			m_pLoc = NULL;
		}

		CoUninitialize();
	}

	return m_isInit;
}

void CWmiUtils::Uninitialize()
{
	if (m_isInit)
	{
		m_pSvc->Release();
		m_pSvc = NULL;
		m_pLoc->Release();
		m_pLoc = NULL;
		CoUninitialize();

		m_isInit = false;
	}
}

bool CWmiUtils::Query(LPCTSTR lpSql, std::function<void(IWbemClassObject* pclsObj)> mb)
{
	HRESULT hres = S_OK;
	TCHAR szWmiSql[MAX_PATH] = { 0 };
	IEnumWbemClassObject* pEnumerator = NULL;

	if (!m_isInit || !mb)
	{
		return false;
	}

	(void)StringCchPrintf(szWmiSql, _countof(szWmiSql), _T("%s"), lpSql);

	hres = m_pSvc->ExecQuery(
		bstr_t(_T("WQL")),
		bstr_t(szWmiSql),
		WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
		NULL,
		&pEnumerator);

	if (FAILED(hres))
	{
		return false;
	}

	IWbemClassObject* pclsObj = NULL;
	ULONG uReturn = 0;

	while (true)
	{
		HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
        if (FAILED(hr))
        {
            break;
        }

		if (0 == uReturn)
		{
			break;
		}

		mb(pclsObj);

		pclsObj->Release();
	}

	pEnumerator->Release();
	pEnumerator = NULL;

	return true;
}

_tstring CWmiUtils::GetVariantString(IWbemClassObject* pclsObj, LPCTSTR lpValueName)
{
    _tstring strValue;
    HRESULT hr = S_OK;

    VARIANT vtProp;
    VariantInit(&vtProp);

    hr = pclsObj->Get(lpValueName, 0, &vtProp, 0, 0);
    if (SUCCEEDED(hr) && VT_BSTR == vtProp.vt)
    {
        strValue = vtProp.bstrVal;
    }

    VariantClear(&vtProp);

    return strValue;
}

LONG CWmiUtils::GetVariantLong(IWbemClassObject* pclsObj, LPCTSTR lpValueName)
{
    HRESULT hr = S_OK;
    LONG lValue = 0;

    VARIANT vtProp;
    VariantInit(&vtProp);
    hr = pclsObj->Get(lpValueName, 0, &vtProp, 0, 0);
    if (SUCCEEDED(hr) && VT_I4 == vtProp.vt)
    {
        lValue = vtProp.lVal;
    }

    VariantClear(&vtProp);

    return lValue;
}

INT64 CWmiUtils::GetVariantInt64(IWbemClassObject* pclsObj, LPCTSTR lpValueName)
{
    HRESULT hr = S_OK;
    INT64 i64Value = 0;

    VARIANT vtProp;
    VariantInit(&vtProp);
    hr = pclsObj->Get(lpValueName, 0, &vtProp, 0, 0);
    if (SUCCEEDED(hr) && VT_I8 == vtProp.vt)
    {
        i64Value = vtProp.lVal;
    }

    VariantClear(&vtProp);

    return i64Value;
}

INT8 CWmiUtils::GetVariantUInt8(IWbemClassObject* pclsObj, LPCTSTR lpValueName)
{
    HRESULT hr = S_OK;
    INT8 I8Value = 0;

    VARIANT vtProp;
    VariantInit(&vtProp);
    hr = pclsObj->Get(lpValueName, 0, &vtProp, 0, 0);
    if (SUCCEEDED(hr) && VT_UI1 == vtProp.vt)
    {
        I8Value = vtProp.bVal;
    }

    VariantClear(&vtProp);

    return I8Value;
}

SHORT CWmiUtils::GetVariantShort(IWbemClassObject* pclsObj, LPCTSTR lpValueName)
{
    HRESULT hr = S_OK;
    SHORT sValue = 0;

    VARIANT vtProp;
    VariantInit(&vtProp);
    hr = pclsObj->Get(lpValueName, 0, &vtProp, 0, 0);
    if (SUCCEEDED(hr) && VT_I2 == vtProp.vt)
    {
        sValue = vtProp.iVal;
    }

    VariantClear(&vtProp);

    return sValue;
}

BOOL CWmiUtils::GetVariantBool(IWbemClassObject* pclsObj, LPCTSTR lpValueName)
{
    HRESULT hr = S_OK;
    BOOL bValue = 0;

    VARIANT vtProp;
    VariantInit(&vtProp);
    hr = pclsObj->Get(lpValueName, 0, &vtProp, 0, 0);
    if (SUCCEEDED(hr) && VT_BOOL == vtProp.vt)
    {
        bValue = vtProp.boolVal;
    }

    VariantClear(&vtProp);

    return bValue;
}

std::vector<_tstring> CWmiUtils::GetStrArray(IWbemClassObject* pclsObj, LPCTSTR lpValueName)
{
    HRESULT hr = S_OK;
    std::vector<_tstring> strList;

    VARIANT vtProp;
    VariantInit(&vtProp);
    hr = pclsObj->Get(lpValueName, 0, &vtProp, 0, 0);
    if (SUCCEEDED(hr) && (VT_ARRAY | VT_BSTR) == vtProp.vt)
    {
        SAFEARRAY *pArray =  vtProp.parray;
        BSTR HUGEP* pbstr;

        //获取数组维数
        UINT uDim = SafeArrayGetDim(pArray);

        LONG lLBound = 0;
        LONG lUBound = 0;

        //取得nDim维度的上界
        SafeArrayGetLBound(pArray, uDim, &lLBound);

        //取得nDim维度的下界
        SafeArrayGetUBound(pArray, uDim, &lUBound);

        SafeArrayAccessData(pArray, (void HUGEP**)&pbstr);
        for (int i = 0; i < lUBound - lLBound; i++)
        {
            strList.push_back(*pbstr);
            pbstr++;
        }

        SafeArrayUnaccessData(pArray);

    }
    VariantClear(&vtProp);

    return strList;
}

std::vector<short> CWmiUtils::GetShortArray(IWbemClassObject* pclsObj, LPCTSTR lpValueName)
{
    std::vector<short> shortList;
    HRESULT hr = S_OK;

    VARIANT vtProp;
    VariantInit(&vtProp);
    hr = pclsObj->Get(lpValueName, 0, &vtProp, 0, 0);
    if (SUCCEEDED(hr) && (VT_ARRAY | VT_I2) == vtProp.vt)
    {
        SAFEARRAY* pArray = vtProp.parray;
        SHORT HUGEP* pShort;

        //获取数组维数
        UINT uDim = SafeArrayGetDim(pArray);

        LONG lLBound = 0;
        LONG lUBound = 0;

        //取得nDim维度的上界
        SafeArrayGetLBound(pArray, uDim, &lLBound);

        //取得nDim维度的下界
        SafeArrayGetUBound(pArray, uDim, &lUBound);

        SafeArrayAccessData(pArray, (void HUGEP**) & pShort);
        for (int i = 0; i < lUBound - lLBound; i++)
        {
            shortList.push_back(*pShort);
            pShort++;
        }

        SafeArrayUnaccessData(pArray);

    }
    VariantClear(&vtProp);

    return shortList;
}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用C++代码封装win32操作类, 与MFC相似,对于学习SDK与C++是巨好的参考 Tutorials Menu of tutorials Tutorial 1: The Simplest Window Tutorial 2: Using Classes and Inheritance Tutorial 3: Using Messages to Create a Scribble Window Tutorial 4: Repainting the Window Tutorial 5: Wrapping a Frame around our Scribble Window Tutorial 6: Customising Window Creation Tutorial 7: Customising the Toolbar Tutorial 8: Loading and Saving Files Tutorial 9: Printing Tutorial 10: Finishing Touches Tutorial 1: The Simplest Window The following code uses Win32++ to create a window. This is all the code you need (in combination with Win32++) to create and display a simple window. Note that in order to add the Win32++ code to our program, we use an #include statement as shown below. #include "../Win32++/Wincore.h" INT WINAPI WinMain(HINSTANCE, HINSTANCE, LPTSTR, int) { //Start Win32++ CWinApp MyApp; //Create a CWnd object CWnd MyWindow; //Create (and display) the window MyWindow.Create(); //Run the application return MyApp.Run(); } This program has four key steps: Start Win32++. We do this here by creating a CWinApp object called MyApp. Create a CWnd object called MyWindow. Create a default window by calling the Create function. Start the message loop, by calling the Run function. If you compile and run this program, you'll find that the application doesn't end when the window is closed. This is behaviour is normal. An illustration of how to use messages to control the windows behaviour (including closing the application) will be left until tutorial 3.
C/C是一种编程语言,而WMIWindows Management Instrumentation的缩写,它是Windows操作系统的一个功能,用于管理和监控计算机系统的各种资源和组件。而Win32_DiskDrive是WMI的一个类,用于管理和获取计算机系统中的磁盘驱动器的信息。这个类提供了许多属性和方法,可以帮助我们获取和操作磁盘驱动器的各种信息。 在C/C编程语言中,我们可以使用WMIWin32_DiskDrive类来获取和操作磁盘驱动器的信息。首先,我们需要初始化WMI,然后使用WMI查询语言来查询Win32_DiskDrive类的实例。通过遍历这些实例,我们可以获取磁盘驱动器的各种属性,如驱动器的名称、序列号、容量、型号等等。我们可以通过调用相应的方法,如获取磁盘驱动器的序列号、格式化磁盘等,来操作磁盘驱动器。 具体来说,在C/C中可以使用WMI API编写相关的代码来获取和操作磁盘驱动器的信息。我们需要包含相关的头文件,并使用WMI API中的函数和结构体来实现相应的功能。首先,我们需要初始化WMI和连接到本地计算机的WMI服务。然后,使用WMI查询语句来查询Win32_DiskDrive类的实例。通过遍历这些实例,我们可以获取磁盘驱动器的各种属性,并将其打印或存储起来。此外,我们还可以调用相应的方法来进行磁盘驱动器的操作,如格式化磁盘、扩展磁盘分区等等。 总之,使用C/C编程语言结合WMIWin32_DiskDrive类,我们可以进行磁盘驱动器的信息获取和操作。这对于需要获取和管理计算机系统中磁盘驱动器的应用程序是非常有用的。同时,这也展示了C/C语言的灵活性和与Windows操作系统底层API的结合能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值