mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
2.3 KiB
102 lines
2.3 KiB
#include "precomp.h"
|
|
#include <stdio.h>
|
|
#include <wbemmeta.h>
|
|
#pragma warning(disable:4786)
|
|
#include <wbemcomn.h>
|
|
#include <genutils.h>
|
|
|
|
HRESULT STDMETHODCALLTYPE CMetaData::QueryInterface(REFIID riid, void** ppv)
|
|
{
|
|
if(riid == IID_IUnknown || riid == IID_IWbemMetaData)
|
|
*ppv = (void*)(IWbemMetaData*)this;
|
|
else return E_NOINTERFACE;
|
|
|
|
((IUnknown*)*ppv)->AddRef();
|
|
return S_OK;
|
|
}
|
|
|
|
ULONG STDMETHODCALLTYPE CMetaData::AddRef()
|
|
{
|
|
return InterlockedIncrement(&m_lRef);
|
|
}
|
|
|
|
ULONG STDMETHODCALLTYPE CMetaData::Release()
|
|
{
|
|
long lRef = InterlockedDecrement(&m_lRef);
|
|
if(lRef == 0)
|
|
delete this;
|
|
return lRef;
|
|
}
|
|
|
|
HRESULT CMetaData::GetClass(LPCWSTR wszName, IWbemContext* pContext,
|
|
IWbemClassObject** ppClass)
|
|
{
|
|
_IWmiObject* pClass = NULL;
|
|
HRESULT hres = GetClass(wszName, pContext, &pClass);
|
|
*ppClass = pClass;
|
|
return hres;
|
|
}
|
|
|
|
|
|
CContextMetaData::CContextMetaData(CMetaData* pMeta, IWbemContext* pContext)
|
|
: m_pMeta(pMeta), m_pContext(pContext)
|
|
{
|
|
if(m_pMeta)
|
|
m_pMeta->AddRef();
|
|
if(m_pContext)
|
|
m_pContext->AddRef();
|
|
}
|
|
|
|
CContextMetaData::~CContextMetaData()
|
|
{
|
|
if(m_pMeta)
|
|
m_pMeta->Release();
|
|
if(m_pContext)
|
|
m_pContext->Release();
|
|
}
|
|
|
|
HRESULT CContextMetaData::GetClass(LPCWSTR wszName, _IWmiObject** ppClass)
|
|
{
|
|
_IWmiObject* pObj = NULL;
|
|
HRESULT hres = m_pMeta->GetClass(wszName, m_pContext, &pObj);
|
|
*ppClass = pObj;
|
|
return hres;
|
|
}
|
|
|
|
CStandardMetaData::CStandardMetaData(IWbemServices* pNamespace)
|
|
: m_pNamespace(pNamespace)
|
|
{
|
|
if(m_pNamespace)
|
|
m_pNamespace->AddRef();
|
|
}
|
|
|
|
CStandardMetaData::~CStandardMetaData()
|
|
{
|
|
if(m_pNamespace)
|
|
m_pNamespace->Release();
|
|
}
|
|
|
|
void CStandardMetaData::Clear()
|
|
{
|
|
if(m_pNamespace)
|
|
m_pNamespace->Release();
|
|
m_pNamespace = NULL;
|
|
}
|
|
|
|
HRESULT CStandardMetaData::GetClass(LPCWSTR wszName, IWbemContext* pContext,
|
|
_IWmiObject** ppObj)
|
|
{
|
|
BSTR strName = SysAllocString(wszName);
|
|
CSysFreeMe sfm(strName);
|
|
|
|
IWbemClassObject* pObj = NULL;
|
|
HRESULT hres = m_pNamespace->GetObject(strName, 0, pContext, &pObj, NULL);
|
|
if(FAILED(hres))
|
|
return hres;
|
|
CReleaseMe rm1(pObj);
|
|
|
|
return pObj->QueryInterface(IID__IWmiObject, (void**)ppObj);
|
|
}
|
|
|
|
|
|
|