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 に渡すコマンド ライン引数。 コマンド ラインを空にすることはできません。 コマンド ラインの使用方法については、「Microsoft TechNet の WinSAT コマンド リファレンス」を参照してください 。
[in, optional] pCallbacks
評価が完了または進行したときに通知を受け取るために実装する IWinSATInitiateEvents インターフェイス。 通知を受信しない場合は NULL にすることができます。
[in, optional] callerHwnd
クライアントのウィンドウ ハンドル。 ハンドルは、WinSAT ダイアログ ボックスを中央に配置するために使用されます。 NULL の場合、ダイアログ ボックスはデスクトップの中央に配置されます。
戻り値
このメソッドは、これらの値のいずれかを返すことができます。
次の表に、このメソッドが返す HRESULT 値の一部を示します。
リターン コード/値 | 説明 |
---|---|
|
WinSAT が正常に開始されました。 評価が正常に実行されたかどうかを判断するには、IWinSATInitiateEvents::WinSATComplete メソッドを実装し、hresult パラメーターの値をチェックします。 |
|
コマンド ラインを空にすることはできません。コマンド ライン引数を指定する必要があります。 |
|
コマンド ラインが長すぎます。 最大長は 30,720 バイトです。 |
|
WinSAT プログラムが予期した場所に見つかりませんでした。 |
解説
通常、アドホック評価を実行してコンピューターの 1 つのサブコンポーネントを評価しますが、正式な評価ではコンピューターのすべてのサブコンポーネントが評価されます。 正式な評価を実行するには、 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 |
ヘッダー | winsatcominterfacei.h |
[DLL] | Winsatapi.dll |