Méthode IInitiateWinSATAssessment::InitiateAssessment (winsatcominterfacei.h)
[IInitiateWinSATAssessment::InitiateAssessment peut être modifié ou indisponible pour les versions après Windows 8.1.]
Lance une évaluation ad hoc.
Syntaxe
HRESULT InitiateAssessment(
[in] LPCWSTR cmdLine,
[in, optional] IWinSATInitiateEvents *pCallbacks,
[in, optional] HWND callerHwnd
);
Paramètres
[in] cmdLine
Arguments de ligne de commande à passer à WinSAT. La ligne de commande ne peut pas être vide. Pour l’utilisation de la ligne de commande, consultez Informations de référence sur les commandes WinSAT sur Microsoft TechNet.
[in, optional] pCallbacks
Interface IWinSATInitiateEvents que vous implémentez pour recevoir une notification lorsque l’évaluation se termine ou progresse. Peut être NULL si vous ne souhaitez pas recevoir de notifications.
[in, optional] callerHwnd
Handle de fenêtre de votre client. Le handle est utilisé pour centrer les boîtes de dialogue WinSAT. Si la valeur est NULL, les boîtes de dialogue sont centrées sur le bureau.
Valeur retournée
Cette méthode peut retourner l’une de ces valeurs.
Le tableau suivant répertorie certaines des valeurs HRESULT retournées par cette méthode.
Code/valeur de retour | Description |
---|---|
|
WinSAT a démarré avec succès. Pour déterminer si l’évaluation s’est exécutée correctement, implémentez la méthode IWinSATInitiateEvents::WinSATComplete et case activée la valeur du paramètre hresult. |
|
La ligne de commande ne peut pas être vide ; vous devez fournir des arguments de ligne de commande. |
|
La ligne de commande est trop longue. La longueur maximale est de 30 720 octets. |
|
Impossible de trouver le programme WinSAT comme prévu. |
Remarques
Vous exécutez généralement une évaluation ad hoc pour évaluer un sous-composant de l’ordinateur, tandis qu’une évaluation formelle évalue tous les sous-composants de l’ordinateur. Pour exécuter une évaluation formelle, appelez la méthode IInitiateWinSATAssessment::InitiateFormalAssessment .
Les évaluations ad hoc ne sont pas enregistrées dans le magasin de données WinSAT ; seules les évaluations formelles sont enregistrées dans le magasin de données (vous ne pouvez pas utiliser l’interface IQueryRecentWinSATAssessment pour interroger les résultats). Pour obtenir les résultats d’une évaluation ad hoc, incluez l’argument –xml FileName , qui enregistrera les résultats dans un fichier XML que vous pourrez analyser ultérieurement.
WinSAT nécessite des privilèges d’administrateur pour s’exécuter. Si l’utilisateur ne dispose pas de privilèges d’administrateur, WinSAT affiche une boîte de dialogue qui demande des informations d’identification.
Exemples
L’exemple suivant montre comment exécuter une évaluation ad hoc et recevoir une notification de sa progression.
#include <windows.h>
#include <stdio.h>
#include <conio.h> // For kbhit()
#include <winsatcominterfacei.h>
#pragma comment(lib, "ole32.lib")
BOOL IsKeyEvent(HANDLE hStdIn);
// Class that implements IWinSATInitiateEvents. Implement this class to
// get progress information and completion notification.
class CWinSATCallbacks : public IWinSATInitiateEvents
{
LONG m_lRefCount;
public:
// Constructor, Destructor
CWinSATCallbacks() {m_lRefCount = 1;};
~CWinSATCallbacks() {};
// IUnknown methods
HRESULT __stdcall QueryInterface(REFIID riid, LPVOID *ppvObj);
ULONG __stdcall AddRef();
ULONG __stdcall Release();
// IWinSATInitiateEvents methods
HRESULT __stdcall WinSATComplete(HRESULT hr, LPCWSTR description);
HRESULT __stdcall WinSATUpdate(UINT currentTick, UINT tickTotal, LPCWSTR currentState);
};
HRESULT CWinSATCallbacks::QueryInterface(REFIID riid, LPVOID* ppvObj)
{
if (riid == __uuidof(IUnknown) || riid == __uuidof(IWinSATInitiateEvents))
{
*ppvObj = this;
}
else
{
*ppvObj = NULL;
return E_NOINTERFACE;
}
AddRef();
return NOERROR;
}
ULONG CWinSATCallbacks::AddRef()
{
return InterlockedIncrement(&m_lRefCount);
}
ULONG CWinSATCallbacks::Release()
{
ULONG ulCount = InterlockedDecrement(&m_lRefCount);
if(0 == ulCount)
{
delete this;
}
return ulCount;
}
// Is called when WinSAT completes the assessment or an error occurs.
HRESULT CWinSATCallbacks::WinSATComplete(HRESULT hr, LPCWSTR description)
{
if (SUCCEEDED(hr))
{
wprintf(L"\n*** %s", description);
}
else
{
wprintf(L"\n*** The assessment failed with 0x%x (%s)\n", hr, description);
}
return S_OK;
}
// There is no progress information for ad hoc assessment. The method provides the
// name of the component being assessed.
HRESULT CWinSATCallbacks::WinSATUpdate(UINT currentTick, UINT tickTotal, LPCWSTR currentState)
{
return S_OK;
}
void main(void)
{
HRESULT hr = S_OK;
IInitiateWinSATAssessment* pAssessment = NULL;
CWinSATCallbacks* pCallbacks = NULL; // Class that implements IWinSATInitiateEvents
LPWSTR pCommand = L"mem -buffersize 32MB -xml .\\MemoryAssessment.xml";
HANDLE hConsole = INVALID_HANDLE_VALUE;
DWORD dwWait = 0;
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
// Get an instance of the assessment interface.
hr = CoCreateInstance(__uuidof(CInitiateWinSAT),
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(IInitiateWinSATAssessment),
(void**)&pAssessment);
if (FAILED(hr))
{
wprintf(L"Failed to create an instance of IInitiateWinSATAssessment. Failed with 0x%x.\n", hr);
goto cleanup;
}
wprintf(L"Running formal assessment... hit any key when complete.\n");
// Get a handle for console input, so you can break out of the loop.
hConsole = GetStdHandle(STD_INPUT_HANDLE);
if (INVALID_HANDLE_VALUE == hConsole)
{
wprintf(L"GetStdHandle failed with %lu.\n", GetLastError());
goto cleanup;
}
pCallbacks = new CWinSATCallbacks();
if (NULL == pCallbacks)
{
wprintf(L"Failed to create an instance of the CWinSATCallbacks class.\n");
goto cleanup;
}
// Run the formal assessment.
hr = pAssessment->InitiateAssessment(pCommand, pCallbacks, NULL);
if (FAILED(hr))
{
// This is a failure to start WinSAT. If WinSAT fails while running,
// your implementation of the IWinSATInitiateEvents::WinSATComplete
// method will receive the failure code.
wprintf(L"InitiateFormalAssessment failed with 0x%x.\n", hr);
goto cleanup;
}
// Loop until the user presses a key or there is an error.
while (true)
{
dwWait = WaitForSingleObject(hConsole, INFINITE);
if (WAIT_OBJECT_0 == dwWait) // Console input
{
if (IsKeyEvent(hConsole))
break;
}
else if (WAIT_FAILED == dwWait)
{
wprintf(L"WaitForSingleObject failed with %lu\n", GetLastError());
break;
}
}
cleanup:
if (pAssessment)
pAssessment->Release();
if (pCallbacks)
pCallbacks->Release();
if (hConsole)
CloseHandle(hConsole);
CoUninitialize();
}
// Determines whether the console input was a key event.
BOOL IsKeyEvent(HANDLE hStdIn)
{
INPUT_RECORD Record[128];
DWORD dwRecordsRead = 0;
BOOL fKeyPress = FALSE;
if (ReadConsoleInput(hStdIn, Record, 128, &dwRecordsRead))
{
for (DWORD i = 0; i < dwRecordsRead; i++)
{
if (KEY_EVENT == Record[i].EventType)
{
fKeyPress = TRUE;
break;
}
}
}
return fKeyPress;
}
Configuration requise
Client minimal pris en charge | Windows Vista [applications de bureau uniquement] |
Serveur minimal pris en charge | Aucun pris en charge |
Plateforme cible | Windows |
En-tête | winsatcominterfacei.h |
DLL | Winsatapi.dll |