Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
De WMI-opslagplaats bevat vooraf geïnstalleerde prestatieklassen voor alle prestatiebibliotheekobjecten. Exemplaren van de onbewerkte gegevensprestatieklasse Win32_PerfRawData_PerfProc_Process vertegenwoordigen bijvoorbeeld processen. Dit prestatieobject is zichtbaar in System Monitor als procesobject.
De eigenschap PageFaultsPerSec van Win32_PerfRawData_PerfProc_Process betekent de prestatiemeter voor paginafouten per seconde voor het proces. De Win32_PerfFormattedData klassen bevatten de berekende gegevenswaarden die worden weergegeven in System Monitor (Perfmon.exe). De waarde van de eigenschap PageFaultsPerSec van Win32_PerfFormattedData_PerfProc_Process is hetzelfde als wanneer deze wordt weergegeven in System Monitor.
Gebruik de COM-API voor WMI- of de Scripting-API voor WMI- om toegang te krijgen tot prestatiegegevens via de prestatiemeteritemsklassen. In beide gevallen is een vernieuwingsfunctie object vereist om elk gegevensmonster te verkrijgen. Zie WMI-taken: Prestatiebewakingvoor meer informatie en scriptcodevoorbeelden voor het gebruik van vernieuwingen en toegang tot prestatieklassen. Zie Toegang tot prestatiegegevens in Scriptvoor meer informatie.
Toegang tot prestatiegegevens vanuit C++
In het volgende C++-codevoorbeeld wordt de prestatiemeterprovider gebruikt voor toegang tot vooraf gedefinieerde hoogpresterende klassen. Er wordt een verversingsobject gemaakt en een object toegevoegd aan het verversingsobject. Het object is een Win32_PerfRawData_PerfProc_Process exemplaar dat de prestaties van een specifiek proces bewaakt. De code leest slechts één itemeigenschap in het procesobject, de eigenschap VirtualBytes. De code vereist de volgende verwijzingen en #include instructies om correct te compileren.
#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
De volgende procedure laat zien hoe u toegang krijgt tot gegevens van een provider met hoge prestaties in C++.
Voor toegang tot gegevens van een provider met hoge prestaties in C++
Maak een verbinding met de WMI-naamruimte en stel WMI-beveiliging in met behulp van een aanroep naar IWbemLocator::ConnectServer en CoSetProxyBlanket.
Deze stap is een standaardstap voor het maken van een WMI-clienttoepassing. Zie Een WMI-toepassing maken met C++voor meer informatie.
Maak een vernieuwingsobject door gebruik te maken van CoCreateInstance met CLSID_WbemRefresher. Vraag een IWbemConfigureRefresher interface aan via de methode QueryInterface. Vraag een IWbemRefresher interface aan via de methode QueryInterface.
De IWbemRefresher interface is de hoofdinterface voor het WMI Refresher-object.
In het volgende C++-codevoorbeeld ziet u hoe u IWbemConfigureRefresher ophaalt.
IWbemRefresher* pRefresher = NULL; HRESULT hr = CoCreateInstance( CLSID_WbemRefresher, NULL, CLSCTX_INPROC_SERVER, IID_IWbemRefresher, (void**) &pRefresher); IWbemConfigureRefresher* pConfig = NULL; pRefresher->QueryInterface( IID_IWbemConfigureRefresher, (void**) &pConfig );Voeg een object toe aan de vernieuwingsfunctie via een aanroep naar de methode IWbemConfigureRefresher::AddObjectByPath methode.
Wanneer u een object aan de vernieuwingsfunctie toevoegt, vernieuwt WMI het object wanneer u de methode IWbemRefresher::Refresh aanroept. Het object dat u toevoegt, wijst de provider aan in de klassekwalificaties.
In het volgende C++-codevoorbeeld ziet u hoe u AddObjectByPath-aanroept.
IWbemClassObject* pObj = NULL; IWbemServices* pNameSpace = NULL; // Add the instance to be refreshed. hr = pConfig->AddObjectByPath( pNameSpace, L"Win32_PerfRawData_PerfProc_Process.Name=\"WINWORD\"", 0L, NULL, &pObj, NULL ); if (FAILED(hr)) { cout << "Could not add object. Error code: 0x" << hex << hr << endl; pNameSpace->Release(); return hr; }Als u snellere toegang tot het object wilt instellen, maakt u verbinding met de interface IWbemObjectAccess via QueryInterface- op de interface van IWbemClassObject.
In het volgende C++-codevoorbeeld ziet u hoe u een aanwijzer naar het object ophaalt met behulp van IWbemObjectAccess- in plaats van IWbemClassObject.
// For quick property retrieval, use IWbemObjectAccess. IWbemObjectAccess* pAcc = NULL; pObj->QueryInterface( IID_IWbemObjectAccess, (void**) &pAcc ); // This is not required. pObj->Release();De IWbemObjectAccess--interface verhoogt de prestaties omdat u ingangen kunt krijgen voor specifieke tellereigenschappen. Hiervoor moet u het object in uw code vergrendelen en ontgrendelen. Dit is een bewerking die IWbemClassObject uitvoert voor elke toegang tot eigenschappen.
Haal de ingangen van de eigenschappen op die moeten worden onderzocht met behulp van aanroepen naar de methode IWbemObjectAccess::GetPropertyHandle.
Eigenschapsgrepen zijn hetzelfde voor alle exemplaren van een klasse, wat betekent dat u de eigenschapsgreep gebruikt die u ophaalt uit een specifiek exemplaar voor alle exemplaren van een specifieke klasse. U kunt ook een ingang verkrijgen van een klasseobject om eigenschapswaarden op te halen uit een exemplaarobject.
In het volgende C++-codevoorbeeld wordt getoond hoe u een eigenschapshandle kunt ophalen.
// Get a property handle for the VirtualBytes property long lVirtualBytesHandle = 0; DWORD dwVirtualBytes = 0; CIMTYPE variant; hr = pAcc->GetPropertyHandle(L"VirtualBytes", &variant, &lVirtualBytesHandle ); if (FAILED(hr)) { cout << "Could not get property handle. Error code: 0x" << hex << hr << endl; return hr; }Maak een programmeerlus waarmee de volgende acties worden uitgevoerd:
Vernieuw het object met een aanroep naar IWbemRefresher::Vernieuw met behulp van de aanwijzer die in de vorige aanroep is gemaakt voor CoCreateInstance.
In deze aanroep vernieuwt WMI Refresher het clientobject met behulp van gegevens die de provider levert.
Voer indien nodig een actie uit op het object, zoals het ophalen van een eigenschapsnaam, gegevenstype of waarde.
U hebt toegang tot de eigenschap via de eigenschapsgreep die u eerder hebt verkregen. Vanwege de aanroep Vernieuwen, vernieuwt WMI de eigenschap elke keer door de lus.
In het volgende C++-voorbeeld ziet u hoe u de WMI high-performance API gebruikt.
// Get the local locator object
IWbemServices* pNameSpace = NULL;
IWbemLocator* pWbemLocator = NULL;
CIMTYPE variant;
VARIANT VT;
CoCreateInstance( CLSID_WbemLocator, NULL,
CLSCTX_INPROC_SERVER, IID_IWbemLocator, (void**) &pWbemLocator
);
// Connect to the desired namespace
BSTR bstrNameSpace = SysAllocString( L"\\\\.\\root\\cimv2" );
HRESULT hr = WBEM_S_NO_ERROR;
hr = pWbemLocator->ConnectServer(
bstrNameSpace, // Namespace name
NULL, // User name
NULL, // Password
NULL, // Locale
0L, // Security flags
NULL, // Authority
NULL, // Wbem context
&pNameSpace // Namespace
);
if ( SUCCEEDED( hr ) )
{
// 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))
{
cout << "Cannot set proxy blanket. Error code: 0x"
<< hex << hr << endl;
pNameSpace->Release();
return hr;
}
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))
{
cout << "Cannot set proxy blanket. Error code: 0x"
<< hex << hr << endl;
pUnk->Release();
return hr;
}
// Clean up the IUnknown.
pUnk->Release();
IWbemRefresher* pRefresher = NULL;
IWbemConfigureRefresher* pConfig = NULL;
// Create a WMI Refresher and get a pointer to the
// IWbemConfigureRefresher interface.
CoCreateInstance(CLSID_WbemRefresher,
NULL,
CLSCTX_INPROC_SERVER,
IID_IWbemRefresher,
(void**) &pRefresher
);
pRefresher->QueryInterface(IID_IWbemConfigureRefresher,
(void**) &pConfig );
IWbemClassObject* pObj = NULL;
// Add the instance to be refreshed.
pConfig->AddObjectByPath(
pNameSpace,
L"Win32_PerfRawData_PerfProc_Process.Name=\"WINWORD\"",
0L,
NULL,
&pObj,
NULL
);
if (FAILED(hr))
{
cout << "Cannot add object. Error code: 0x"
<< hex << hr << endl;
pNameSpace->Release();
return hr;
}
// For quick property retrieval, use IWbemObjectAccess.
IWbemObjectAccess* pAcc = NULL;
pObj->QueryInterface(IID_IWbemObjectAccess,
(void**) &pAcc );
// This is not required.
pObj->Release();
// Get a property handle for the VirtualBytes property.
long lVirtualBytesHandle = 0;
DWORD dwVirtualBytes = 0;
pAcc->GetPropertyHandle(L"VirtualBytes",
&variant,
&lVirtualBytesHandle );
// Refresh the object ten times and retrieve the value.
for( int x = 0; x < 10; x++ )
{
pRefresher->Refresh( 0L );
pAcc->ReadDWORD( lVirtualBytesHandle, &dwVirtualBytes );
printf( "Process is using %lu bytes\n", dwVirtualBytes );
// Sleep for a second.
Sleep( 1000 );
}
// Clean up all the objects.
pAcc->Release();
// Done with these too.
pConfig->Release();
pRefresher->Release();
pNameSpace->Release();
}
SysFreeString( bstrNameSpace );
pWbemLocator->Release();
Verwante onderwerpen