Partager via


Méthode IInitiateWinSATAssessment::InitiateFormalAssessment (winsatcominterfacei.h)

[IInitiateWinSATAssessment::InitiateFormalAssessment peut être modifié ou indisponible pour les versions après Windows 8.1.]

Lance une évaluation formelle.

Syntaxe

HRESULT InitiateFormalAssessment(
  [in, optional] IWinSATInitiateEvents *pCallbacks,
  [in, optional] HWND                  callerHwnd
);

Paramètres

[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
S_OK
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.
WINSAT_ERROR_WINSAT_DOES_NOT_EXIST
0x80040011
Impossible de trouver le programme WinSAT comme prévu.

Remarques

Vous exécutez généralement une évaluation formelle pour évaluer tous les sous-composants de l’ordinateur, tandis qu’une évaluation ad hoc évalue un sous-composant de l’ordinateur. Pour exécuter une évaluation ad hoc, appelez la méthode IInitiateWinSATAssessment::InitiateAssessment .

Pour obtenir les résultats d’une évaluation formelle, utilisez l’interface IQueryRecentWinSATAssessment .

Si vous appelez cette fonction à partir d’une application Windows, implémentez l’interface IWinSATInitiateEvents afin que vous puissiez afficher des informations sur la progression et recevoir une notification une fois l’évaluation terminée. Pour une application console Windows, l’affichage de la progression n’est pas nécessaire, car WinSAT écrit les informations de progression dans la fenêtre de console.

Notez que 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 formelle 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")

// 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;
}

// Is called when the assessment makes progress. Indicates the percentage of the assessment
// that is complete and the current component being assessed.
HRESULT CWinSATCallbacks::WinSATUpdate(UINT currentTick, UINT tickTotal, LPCWSTR currentState)
{
    // Typically, you would provide the tick values to a ProgressBar control.

    if (tickTotal > 0)
    {
        wprintf(L"\n*** Percent complete: %u%%\n", 100*currentTick/tickTotal);
        wprintf(L"*** Currently assessing: %s\n\n", currentState);
    }

    return S_OK;
}

void main(void)
{
    HRESULT hr = S_OK;
    IInitiateWinSATAssessment* pAssessment = NULL;
    CWinSATCallbacks* pCallbacks = NULL;  // Class that implements IWinSATInitiateEvents

    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");

    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->InitiateFormalAssessment(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;
    }

    while (!_kbhit())
        Sleep(10);

cleanup:

    if (pAssessment)
        pAssessment->Release();

    if (pCallbacks)
        pCallbacks->Release();

    CoUninitialize();
}

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

Voir aussi

IInitiateWinSATAssessment

IInitiateWinSATAssessment::InitiateAssessment

IQueryRecentWinSATAssessment