Поделиться через


Метод IInitiateWinSATAssessment::InitiateAssessment (winsatcominterfacei.h)

[IInitiateWinSATAssessment::InitiateAssessment может быть изменен или недоступен для выпусков после Windows 8.1.]

Инициирует специальную оценку.

Синтаксис

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

Параметры

[in] cmdLine

Аргументы командной строки для передачи в WinSAT. Командная строка не может быть пустой. Сведения об использовании командной строки см. в справочнике по командам WinSAT в Microsoft TechNet.

[in, optional] pCallbacks

Интерфейс IWinSATInitiateEvents , который реализуется для получения уведомлений о завершении оценки или ее выполнении. Если вы не хотите получать уведомления, может иметь значение NULL .

[in, optional] callerHwnd

Дескриптор окна клиента. Дескриптор используется для выравнивания диалоговых окон WinSAT. Если значение РАВНО NULL, диалоговые окна размещаются по центру рабочего стола.

Возвращаемое значение

Этот метод может возвращать одно из этих значений.

В следующей таблице перечислены некоторые значения HRESULT, возвращаемые этим методом.

Возвращаемый код или значение Описание
S_OK
WinSAT успешно запущен. Чтобы определить, успешно ли выполнена оценка, реализуйте метод IWinSATInitiateEvents::WinSATComplete и проверка значение параметра hresult.
WINSAT_ERROR_COMMAND_LINE_EMPTY
0x80040009
Командная строка не может быть пустой; Необходимо указать аргументы командной строки.
WINSAT_ERROR_COMMAND_LINE_TOO_LONG
0x8004000A
Командная строка слишком длинна. Максимальная длина составляет 30 720 байт.
WINSAT_ERROR_WINSAT_DOES_NOT_EXIST
0x80040011
Не удалось найти программу WinSAT там, где ожидалось.

Комментарии

Обычно выполняется специальная оценка для оценки одного подкомпонента компьютера, в то время как официальная оценка оценивает все подкомпоненты компьютера. Чтобы выполнить официальную оценку, вызовите метод IInitiateWinSATAssessment::InitiateFormalAssessment .

Нерегламентированные оценки не сохраняются в хранилище данных WinSAT; В хранилище данных сохраняются только формальные оценки (для запроса результатов нельзя использовать интерфейс IQueryRecentWinSATAssessment ). Чтобы получить результаты нерегламентированной оценки, добавьте аргумент –xml FileName , который сохранит результаты в XML-файл, который можно будет проанализировать позже.

Для запуска WinSAT требуются права администратора. Если у пользователя нет прав администратора, WinSAT отобразит диалоговое окно с запросом учетных данных.

Примеры

В следующем примере показано, как выполнить специальную оценку и получать уведомления о ходе ее выполнения.

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

Требования

   
Минимальная версия клиента Windows Vista [только классические приложения]
Минимальная версия сервера Ни одна версия не поддерживается
Целевая платформа Windows
Header winsatcominterfacei.h
DLL Winsatapi.dll

См. также раздел

IInitiateWinSATAssessment

IInitiateWinSATAssessment::InitiateFormalAssessment

IWinSATInitiateEvents