다음을 통해 공유


IInitiateWinSATAssessment::InitiateFormalAssessment 메서드(winsatcominterfacei.h)

[IInitiateWinSATAssessment::InitiateFormalAssessment는 Windows 8.1 후 릴리스에서 변경되거나 사용할 수 없습니다.]

공식 평가를 시작합니다.

구문

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

매개 변수

[in, optional] pCallbacks

평가가 완료되거나 진행 중일 때 알림을 수신하도록 구현하는 IWinSATInitiateEvents 인터페이스입니다. 알림을 받지 않으려면 NULL 일 수 있습니다.

[in, optional] callerHwnd

클라이언트의 창 핸들입니다. 핸들은 WinSAT 대화 상자를 가운데에 배치하는 데 사용됩니다. NULL이면 대화 상자가 바탕 화면 가운데에 배치됩니다.

반환 값

이 메서드는 이러한 값 중 하나를 반환할 수 있습니다.

다음 표에서는 이 메서드가 반환하는 HRESULT 값 중 일부를 나열합니다.

반환 코드/값 설명
S_OK
WinSAT가 성공적으로 시작되었습니다. 평가가 성공적으로 실행되었는지 확인하려면 IWinSATInitiateEvents::WinSATComplete 메서드를 구현하고 hresult 매개 변수 값을 검사.
WINSAT_ERROR_WINSAT_DOES_NOT_EXIST
0x80040011
필요한 경우 WinSAT 프로그램을 찾을 수 없습니다.

설명

일반적으로 정식 평가를 실행하여 컴퓨터의 모든 하위 구성 요소를 평가하는 반면 임시 평가는 컴퓨터의 하위 구성 요소 하나를 평가합니다. 임시 평가를 실행하려면 IInitiateWinSATAssessment::InitiateAssessment 메서드를 호출합니다 .

공식 평가 결과를 얻으려면 IQueryRecentWinSATAssessment 인터페이스를 사용합니다.

Windows 애플리케이션에서 이 함수를 호출하는 경우 진행률 정보를 표시하고 평가가 완료되면 알림을 받을 수 있도록 IWinSATInitiateEvents 인터페이스를 구현합니다. Windows 콘솔 애플리케이션의 경우 WinSAT가 콘솔 창에 진행률 정보를 쓰기 때문에 진행률을 표시할 필요가 없습니다.

WinSAT를 실행하려면 관리자 권한이 필요합니다. 사용자에게 관리자 권한이 없는 경우 WinSAT는 자격 증명을 요청하는 대화 상자를 표시합니다.

예제

다음 예제에서는 공식 평가를 실행하고 진행률에 대한 알림을 받는 방법을 보여 줍니다.

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

요구 사항

   
지원되는 최소 클라이언트 Windows Vista [데스크톱 앱만 해당]
지원되는 최소 서버 지원되는 버전 없음
대상 플랫폼 Windows
헤더 winsatcominterfacei.h
DLL Winsatapi.dll

추가 정보

IInitiateWinSATAssessment

IInitiateWinSATAssessment::InitiateAssessment

IQueryRecentWinSATAssessment