Compartilhar via


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

[IInitiateWinSATAssessment::InitiateAssessment pode ser alterado ou indisponível para versões após Windows 8.1.]

Inicia uma avaliação ad hoc.

Sintaxe

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

Parâmetros

[in] cmdLine

Argumentos de linha de comando a serem passados para WinSAT. A linha de comando não pode estar vazia. Para uso da linha de comando, consulte Referência de comando winSAT no Microsoft TechNet.

[in, optional] pCallbacks

Uma interface IWinSATInitiateEvents que você implementa para receber notificação quando a avaliação for concluída ou progredir. Pode ser NULL se você não quiser receber notificações.

[in, optional] callerHwnd

O identificador de janela do cliente. O identificador é usado para centralizar as caixas de diálogo WinSAT. Se FOR NULL, as caixas de diálogo serão centralizados na área de trabalho.

Valor retornado

Esse método pode retornar um desses valores.

Esta tabela a seguir lista alguns dos valores HRESULT que esse método retorna.

Valor/código retornado Descrição
S_OK
WinSAT iniciado com êxito. Para determinar se a avaliação foi executada com êxito, implemente o método IWinSATInitiateEvents::WinSATComplete e marcar o valor do parâmetro hresult.
WINSAT_ERROR_COMMAND_LINE_EMPTY
0x80040009
A linha de comando não pode estar vazia; você deve fornecer argumentos de linha de comando.
WINSAT_ERROR_COMMAND_LINE_TOO_LONG
0x8004000A
A linha de comando é muito longa. O comprimento máximo é de 30.720 bytes.
WINSAT_ERROR_WINSAT_DOES_NOT_EXIST
0x80040011
Não foi possível encontrar o programa WinSAT onde o esperado.

Comentários

Normalmente, você executa uma avaliação ad hoc para avaliar um subcomponente do computador, enquanto uma avaliação formal avalia todos os subcomponentes do computador. Para executar uma avaliação formal, chame o método IInitiateWinSATAssessment::InitiateFormalAssessment .

As avaliações ad hoc não são salvas no armazenamento de dados WinSAT; somente as avaliações formais são salvas no armazenamento de dados (você não pode usar a interface IQueryRecentWinSATAssessment para consultar os resultados). Para obter os resultados de uma avaliação ad hoc, inclua o argumentoFileName–xml , que salvará os resultados em um arquivo XML que você pode analisar posteriormente.

O WinSAT requer privilégios de administrador para execução. Se o usuário não tiver privilégios de administrador, o WinSAT exibirá uma caixa de diálogo que solicita credenciais.

Exemplos

O exemplo a seguir mostra como executar uma avaliação ad hoc e receber notificação de seu progresso.

#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 com suporte Windows Vista [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Nenhum compatível
Plataforma de Destino Windows
Cabeçalho winsatcominterfacei.h
DLL Winsatapi.dll

Confira também

IInitiateWinSATAssessment

IInitiateWinSATAssessment::InitiateFormalAssessment

IWinSATInitiateEvents