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 값 중 일부를 나열합니다.
반환 코드/값 | Description |
---|---|
|
WinSAT가 성공적으로 시작되었습니다. 평가가 성공적으로 실행되었는지 확인하려면 IWinSATInitiateEvents::WinSATComplete 메서드를 구현하고 hresult 매개 변수 값을 검사. |
|
명령줄은 비워 둘 수 없습니다. 명령줄 인수를 제공해야 합니다. |
|
명령줄이 너무 깁니다. 최대 길이는 30,720바이트입니다. |
|
필요한 경우 WinSAT 프로그램을 찾을 수 없습니다. |
설명
일반적으로 임시 평가를 실행하여 컴퓨터의 하위 구성 요소 하나를 평가하는 반면, 공식적인 평가는 컴퓨터의 모든 하위 구성 요소에 대해 평가합니다. 공식적인 평가를 실행하려면 IInitiateWinSATAssessment::InitiateFormalAssessment 메서드를 호출합니다 .
임시 평가는 WinSAT 데이터 저장소에 저장되지 않습니다. 공식 평가만 데이터 저장소에 저장됩니다( IQueryRecentWinSATAssessment 인터페이스를 사용하여 결과를 쿼리할 수 없음). 임시 평가 결과를 얻으려면 나중에 구문 분석할 수 있는 XML 파일에 결과를 저장하는 –xml FileName 인수를 포함합니다.
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 |