IEnumWbemClassObject::Next() fails on Win2K
- From: robert@xxxxxxxxxxx
- Date: 15 Oct 2006 16:33:05 -0700
Hi,
I'm implementing some functions in my VC++ program that can monitor the
CPU usage of my the program. It seems to be working fine on WinXP but
on Win2K I get an HRESULT error WBEM_E_INVALID_QUERY when issuing the
call
pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
where pEnumerator is an IEnumWbemClassObject type. The complete
function that doesn't fail on XP but on win2K looks as follows:
void CPerformance::Initialise()
{
if (m_binitialised)
return;
CoInitializeEx(NULL,COINIT_MULTITHREADED);
if (FAILED (hr = CoInitializeSecurity(NULL, -1, NULL, NULL,
RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE,
NULL, EOAC_NONE, 0)))
{
CleanUp();
return;
}
if (FAILED (hr = CoCreateInstance(CLSID_WbemLocator, NULL,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (void**) &pWbemLocator)))
{
CleanUp();
return;
}
if (!pNameSpace)
{
if (FAILED (hr = pWbemLocator->ConnectServer(
_bstr_t(L"root\\cimv2"),
NULL, // User name
NULL, // Password
NULL, // Locale
0L, // Security flags
NULL, // Authority
NULL, // Wbem context
&pNameSpace)))
{
CleanUp();
return;
}
}
pWbemLocator->Release();
pWbemLocator=NULL;
// Set namespace security.
IUnknown* pUnk = NULL;
pNameSpace->QueryInterface( IID_IUnknown, (void**) &pUnk );
hr = CoSetProxyBlanket(pNameSpace, RPC_C_AUTHN_WINNT,
RPC_C_AUTHZ_NONE,
NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE,
NULL, EOAC_NONE);
if (FAILED(hr))
{
CleanUp();
return;
}
hr = CoSetProxyBlanket(pUnk, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE,
NULL,
RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL,
EOAC_NONE);
if (FAILED(hr))
{
CleanUp();
return;
}
if (FAILED (hr = CoCreateInstance(CLSID_WbemRefresher, NULL,
CLSCTX_INPROC_SERVER,
IID_IWbemRefresher, (void**) &pRefresher)))
{
CleanUp();
return;
}
if (FAILED (hr =
pRefresher->QueryInterface(IID_IWbemConfigureRefresher,
(void **)&pConfig)))
{
CleanUp();
return;
}
DWORD pid = GetCurrentProcessId();
wchar_t wstr[123];
wsprintfW(wstr,
L"Select * from Win32_PerfRawData_PerfProc_Process WHERE IDProcess =
%u", pid);
IEnumWbemClassObject* pEnumerator = NULL;
if (FAILED (hr = pNameSpace->ExecQuery(bstr_t("WQL"), wstr,
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL,
&pEnumerator)))
{
CleanUp();
return;
}
if (FAILED(hr))
{
CleanUp();
return;
}
ULONG uReturn = 0;
if (pEnumerator)
{
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
if(0 == uReturn)
{
CleanUp();
return;
}
long id = 0;
pConfig->AddObjectByTemplate(pNameSpace, pclsObj, NULL, NULL,
&pclsObj2, &id);
}
}
I'm not an expert on WMI so most of the code has been copied from
various other examples. If anyone knows what is wrong or what
precautions I need to take on win2k that would be great.
Thanks,
Rob
.
- Follow-Ups:
- Re: IEnumWbemClassObject::Next() fails on Win2K
- From: robert
- Re: IEnumWbemClassObject::Next() fails on Win2K
- Prev by Date: Re: Identify the Path of a Running Windows Service
- Next by Date: Wmi documentation
- Previous by thread: WMI function to "make (folder) available offline" ??
- Next by thread: Re: IEnumWbemClassObject::Next() fails on Win2K
- Index(es):
Relevant Pages
|
Loading