提供可变数组封装、可变类型数值/字符串获取等。
头文件:
#pragma once
#include <ccc/stdafx.h>
#include <comdef.h>
#include <comutil.h>
#include <Wbemidl.h>
namespace ccc
{
namespace win32
{
bool Win32Variant_Callvirt(IWbemServices* services, IWbemClassObject* obj, const _bstr_t& clazz, const _bstr_t& method, ccc::function<bool(IWbemClassObject*)>&& internal_call) noexcept;
inline ccc::string VARIANT_string(BSTR& bstrVal)
{
ccc::string result;
LPSTR str = _com_util::ConvertBSTRToString(bstrVal);
if (NULL != str)
{
result = str;
delete[] str;
}
SysFreeString(bstrVal);
return result;
}
inline ccc::string VARIANT_string(VARIANT& vt) noexcept
{
ccc::string result;
if (vt.vt & VT_BSTR)
{
result = VARIANT_string(vt.bstrVal);
}
if (vt.vt != VT_EMPTY)
{
VariantClear(&vt);
}
return result;
}
inline ccc::string VARIANT_string(IWbemClassObject* obj, LPCWSTR name) noexcept
{
VARIANT vt;
VariantInit(&vt);
HRESULT hr = obj->Get(name, 0, &vt, 0, 0);
if (SUCCEEDED(hr))
{
ccc::string result = VARIANT_string(vt);
VariantClear(&vt);
return result;
}
else
{
VariantClear(&vt);
return ccc::string();
}
}
template <typename T>
inline T VARIANT_value(VARIANT& vt, T defaultValue) noexcept
{
if (vt.vt == VT_I1)
{
return vt.cVal;
}
if (vt.vt == VT_I