IEnumWbemClassObject::Next() fails on Win2K



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

.



Relevant Pages

  • Re: IEnumWbemClassObject::Next() fails on Win2K
    ... on Win2K I get an HRESULT error WBEM_E_INVALID_QUERY when issuing the ... where pEnumerator is an IEnumWbemClassObject type. ... DWORD pid = GetCurrentProcessId; ... ULONG uReturn = 0; ...
    (microsoft.public.win32.programmer.wmi)
  • Error retrieving remote system values
    ... i am trying to retrieve remote system attributes using WMI but the ... please find the code snippet ... IEnumWbemClassObject* pEnumerator = NULL; ... ULONG uReturn = 0; ...
    (microsoft.public.vc.language)
  • Error retrieving remote system values
    ... i am trying to retrieve remote system attributes using WMI but the ... please find the code snippet ... IEnumWbemClassObject* pEnumerator = NULL; ... ULONG uReturn = 0; ...
    (microsoft.public.vc.mfc)

Loading