Compartir a través de


Método IInitiateWinSATAssessment::InitiateAssessment (winsatcominterfacei.h)

[IInitiateWinSATAssessment::InitiateAssessment puede modificarse o no estar disponible para versiones después de Windows 8.1.]

Inicia una evaluación ad hoc.

Sintaxis

HRESULT InitiateAssessment(
  [in]           LPCWSTR               cmdLine,
  [in, optional] IWinSATInitiateEvents *pCallbacks,
  [in, optional] HWND                  callerHwnd
);

Parámetros

[in] cmdLine

Argumentos de la línea de comandos que se van a pasar a WinSAT. La línea de comandos no puede estar vacía. Para obtener el uso de la línea de comandos, consulte Referencia de comandos de WinSAT en Microsoft TechNet.

[in, optional] pCallbacks

Interfaz IWinSATInitiateEvents que se implementa para recibir notificaciones cuando la evaluación finaliza o progresa. Puede ser NULL si no desea recibir notificaciones.

[in, optional] callerHwnd

Identificador de ventana del cliente. El identificador se usa para centrar los cuadros de diálogo de WinSAT. Si es NULL, los cuadros de diálogo se centran en el escritorio.

Valor devuelto

Este método puede devolver uno de estos valores.

En esta tabla siguiente se enumeran algunos de los valores HRESULT que devuelve este método.

Código o valor devuelto Descripción
S_OK
WinSAT se inició correctamente. Para determinar si la evaluación se ejecutó correctamente, implemente el método IWinSATInitiateEvents::WinSATComplete y compruebe el valor del parámetro hresult .
WINSAT_ERROR_COMMAND_LINE_EMPTY
0x80040009
La línea de comandos no puede estar vacía; Debe proporcionar argumentos de línea de comandos.
WINSAT_ERROR_COMMAND_LINE_TOO_LONG
0x8004000A
La línea de comandos es demasiado larga. La longitud máxima es de 30 720 bytes.
WINSAT_ERROR_WINSAT_DOES_NOT_EXIST
0x80040011
No se encontró el programa WinSAT donde se esperaba.

Comentarios

Normalmente, se ejecuta una evaluación ad hoc para evaluar un subcomponente del equipo, mientras que una evaluación formal evalúa todos los subcomponentes del equipo. Para ejecutar una evaluación formal, llame al método IInitiateWinSATAssessment::InitiateFormalAssessment .

Las evaluaciones ad hoc no se guardan en el almacén de datos winSAT; solo las evaluaciones formales se guardan en el almacén de datos (no se puede usar la interfaz IQueryRecentWinSATAssessment para consultar los resultados). Para obtener los resultados de una evaluación ad hoc, incluya el argumento –xml FileName , que guardará los resultados en un archivo XML que puede analizar más adelante.

WinSAT requiere privilegios de administrador para ejecutarse. Si el usuario no tiene privilegios de administrador, WinSAT mostrará un cuadro de diálogo que solicita las credenciales.

Ejemplos

En el ejemplo siguiente se muestra cómo ejecutar una evaluación ad hoc y recibir una notificación de su progreso.

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

Requisitos

   
Cliente mínimo compatible Windows Vista [solo aplicaciones de escritorio]
Servidor mínimo compatible No se admite ninguno
Plataforma de destino Windows
Encabezado winsatcominterfacei.h
Archivo DLL Winsatapi.dll

Consulte también

IInitiateWinSATAssessment

IInitiateWinSATAssessment::InitiateFormalAssessment

IWinSATInitiateEvents