Share via


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 プログラムが予期した場所に見つかりませんでした。

解説

通常、正式な評価を実行してコンピューターのすべてのサブコンポーネントを評価しますが、アドホック評価ではコンピューターの 1 つのサブコンポーネントが評価されます。 アドホック評価を実行するには、 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