Přístup k předinstalovaným třídám výkonu služby WMI
Úložiště rozhraní WMI obsahuje předinstalované třídy výkonu pro všechny objekty knihovny výkonu. Například instance nezpracované třídy výkonu dat Win32_PerfRawData_PerfProc_Process představují procesy. Tento objekt výkonu je viditelný v nástroji Sledování systému jako objekt Proces.
Vlastnost PageFaultsPerSec objektu Win32_PerfRawData_PerfProc_Process představuje čítač výkonu chyb stránky za sekundu pro proces. Třídy Win32_PerfFormattedData obsahují hodnoty počítaných dat zobrazené v nástroji System Monitor (Perfmon.exe). Hodnota vlastnosti PageFaultsPerSecWin32_PerfFormattedData_PerfProc_Process je stejná jako při zobrazení v nástroji System Monitor.
Pomocí rozhraní COM API pro rozhraní WMI nebo rozhraní API pro skriptování pro rozhraní WMI přistupovat k datům o výkonu prostřednictvím tříd čítačů výkonu. V obou případech se k získání každého vzorku dat vyžaduje objekt. Další informace a příklady kódu skriptu pro použití aktualizačních procesů a přístupu ke třídám výkonu najdete v tématu Úlohy rozhraní WMI: Sledování výkonu. Další informace najdete v tématu Přístup k datům o výkonu ve skriptu.
Přístup k datům o výkonu z C++
Následující příklad kódu C++ používá poskytovatele čítačů výkonu pro přístup k předdefinovaným vysoce výkonným třídám. Vytvoří objekt aktualizačního modulu a přidá objekt do aktualizačního modulu. Objekt je instance Win32_PerfRawData_PerfProc_Process, která monitoruje výkon konkrétního procesu. Kód čte v objektu procesu pouze jednu vlastnost čítače, vlastnost VirtualBytes. Kód vyžaduje, aby správně zkompiloval následující odkazy a příkazy #include.
#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
Následující postup ukazuje, jak získat přístup k datům z vysoce výkonného poskytovatele v jazyce C++.
Přistupovat k datům od poskytovatele s vysokým výkonem v C++
Navázat připojení k oboru názvů rozhraní WMI a nastavit zabezpečení rozhraní WMI pomocí volání IWbemLocator::ConnectServer a CoSetProxyBlanket.
Tento krok je standardní krok pro vytvoření libovolné klientské aplikace rozhraní WMI. Další informace naleznete v tématu Vytvoření aplikace rozhraní WMI pomocíjazyka C++ .
Pomocí CoCreateInstance s CLSID_WbemRefresher vytvořte objekt pro obnovení. Požádejte prostřednictvím metody QueryInterface o rozhraní IWbemConfigureRefresher. Prostřednictvím metody QueryInterface požádejte o rozhraní IWbemRefresher.
Rozhraní IWbemRefresher je hlavním rozhraním pro objekt WMI Refresher.
Následující příklad kódu C++ ukazuje, jak načíst IWbemConfigureRefresher.
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 );
Přidejte objekt do aktualizačního modulu voláním metody IWbemConfigureRefresher::AddObjectByPath metoda.
Když přidáte objekt do aktualizačního programu, rozhraní WMI aktualizuje objekt pokaždé, když zavoláte metodu IWbemRefresher::Refresh. Objekt, který přidáte, určí zprostředkovatele pomocí jeho třídních kvalifikátorů.
Následující příklad kódu C++ ukazuje, jak volat AddObjectByPath.
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; }
Pokud chcete nastavit rychlejší přístup k objektu, připojte se k rozhraní IWbemObjectAccess prostřednictvím QueryInterface v rozhraní IWbemClassObject.
Následující příklad kódu C++ ukazuje, jak načíst ukazatel na objekt pomocí IWbemObjectAccess místo IWbemClassObject.
// For quick property retrieval, use IWbemObjectAccess. IWbemObjectAccess* pAcc = NULL; pObj->QueryInterface( IID_IWbemObjectAccess, (void**) &pAcc ); // This is not required. pObj->Release();
IWbemObjectAccess rozhraní zvyšuje výkon, protože můžete získat přístupy k specifickým vlastnostem čítače a vyžaduje, abyste objekt zamkli a odemkli v rámci kódu, což je operace, kterou IWbemClassObject provádí při každém přístupu k vlastnostem.
Získejte popisovače vlastností, které chcete prozkoumat, pomocí metody IWbemObjectAccess::GetPropertyHandle.
Popisovače vlastností jsou stejné pro všechny instance třídy, což znamená, že použijte popisovač vlastnosti, který načítáte z konkrétní instance pro všechny instance konkrétní třídy. Můžete také získat popisovač z objektu třídy k načtení hodnot vlastností z instančního objektu.
Následující příklad kódu C++ ukazuje, jak načíst popisovač vlastnosti.
// 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; }
Vytvořte programovací smyčku, která provádí následující akce:
Aktualizujte objekt pomocí volání IWbemRefresher::Refresh s využitím ukazatele vytvořeného při předchozím volání CoCreateInstance.
V tomto volání nástroj WMI Refresher aktualizuje objekt klienta pomocí dat, která poskytovatel poskytuje.
Podle potřeby proveďte u objektu jakoukoli akci, například načtení názvu vlastnosti, datového typu nebo hodnoty.
K vlastnosti můžete přistupovat prostřednictvím popisovače vlastnosti získaného dříve. Vzhledem k volání Refresh aktualizuje rozhraní WMI vlastnost při každém procházení smyčky.
Následující příklad jazyka C++ ukazuje, jak používat vysoce výkonné rozhraní API služby WMI.
// 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();
Související témata