IQueryRecentWinSATAssessment
COMIDispatch (デュアル)comobj 経由でメソッド名による遅延バインド呼び出しができます(vtableインデックス不要)。公式ドキュメント
直近の正式な WinSAT 評価の結果に関する詳細を取得します。
メソッド 2
vtbl = vtable インデックス(0始まり)。IDispatch 実装のため HSP ではメソッド名でも呼べます(上記)。低レベルの index 呼び出し用に vtbl も掲載。0〜2 は IUnknown。
指定した XPath を使用して、XML 評価ドキュメントからデータを取得します。クエリは、WinSAT データストア内の直近の正式な評価に対して実行されます。
| xPath | LPWSTR | in | 結果 XML から抽出するノードを指定する XPath 式の文字列である。 |
| namespaces | LPWSTR | in | XPath 評価で使用する名前空間宣言を指定する文字列であり、不要な場合は NULL を指定できる。 |
| ppDomNodeList | IXMLDOMNodeList** | out | XPath に一致したノード群を表す IXMLDOMNodeList を受け取るポインタへのポインタである。 |
解説(Remarks)
このメソッドを使用すると、API を通じて提供される概要情報には含まれない評価の詳細を取得できます。評価で利用できるすべての情報の詳細については、WinSAT Schema を参照してください。
最初の正式な評価は、コンピューターを初めてセットアップしたときに実行されます。この初回の評価は、データストアが存続する限りデータストアに残ります。WinSAT データストアには、最大 100 件の正式な評価を格納できます。ストアが容量に達すると、WinSAT は新しい正式な評価が実行されるたびに、データストア内の最も古い評価(初回の評価を除く)を削除します。
WinSAT データストアには、正式な評価のみが格納されます。アドホック評価の評価データを取得したい場合は、評価の実行時に結果を XML ファイルに保存する必要があります(詳細は -xml コマンドライン引数を参照してください)。その後、IXMLDOMDocument2 インターフェイスのメンバーを使用して、アドホック評価のデータをクエリできます。
評価の概要情報を取得するには、IQueryRecentWinSATAssessment::get_Info メソッドを呼び出します。 評価のサブコンポーネントの概要情報を取得するには、IProvideWinSATResultsInfo::GetAssessmentInfo メソッドを呼び出します。
例
次の例は、XPath クエリを使用して直近の正式な評価からデータを取得する方法を示しています。
#include <windows.h>
#include <stdio.h>
#include <winsatcominterfacei.h>
#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "oleaut32.lib")
void main(void)
{
HRESULT hr = S_OK;
IQueryRecentWinSATAssessment* pAssessment;
IXMLDOMNodeList* pNodes = NULL;
IXMLDOMNode* pNode = NULL;
long NodeCount = 0;
BSTR bstrXPath = SysAllocString(L"WinSAT/TotalRunTime/Description");
BSTR bstrTime = NULL;
hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
// 直近の正式な評価のインスタンスを取得します。
hr = CoCreateInstance(__uuidof(CQueryWinSAT),
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(IQueryRecentWinSATAssessment),
(void**)&pAssessment);
if (FAILED(hr))
{
wprintf(L"Failed to create an instance of IQueryRecentWinSATAssessment. Failed with 0x%x.\n", hr);
goto cleanup;
}
// XPath 式に一致するノードを評価に対してクエリします。
hr = pAssessment->get_XML(bstrXPath, NULL, &pNodes);
if (FAILED(hr))
{
wprintf(L"pAssessment->get_XML failed with 0x%x.\n", hr);
goto cleanup;
}
hr = pNodes->get_length(&NodeCount);
wprintf(L"There were %d results found for the XPath query.\n\n", NodeCount);
// 結果をループ処理します。
for (long i = 0; i < NodeCount; i++)
{
hr = pNodes->nextNode(&pNode);
if (pNode)
{
hr = pNode->get_text(&bstrTime);
if (S_OK == hr)
{
wprintf(L"Total runtime of the assessment: %s\n", bstrTime);
SysFreeString(bstrTime);
}
else
{
wprintf(L"pNode->get_text failed with 0x%x.\n", hr);
goto cleanup;
}
pNode->Release();
pNode = NULL;
}
else
{
wprintf(L"pNodes->nextNode failed with 0x%x.\n", hr);
goto cleanup;
}
}
cleanup:
if (pAssessment)
pAssessment->Release();
if (pNodes)
pNodes->Release();
if (bstrXPath)
SysFreeString(bstrXPath);
CoUninitialize();
}
直近の正式な評価の結果に関する情報(たとえば基本スコアや評価を実行した日付など)を提供するインターフェイスを取得します。
| ppWinSATAssessmentInfo | IProvideWinSATResultsInfo** | out | 直近の WinSAT 評価結果情報を表す IProvideWinSATResultsInfo インターフェイスを受け取るポインタへのポインタである。 |
解説(Remarks)
評価のサブコンポーネントの概要情報を取得するには、IProvideWinSATResultsInfo::GetAssessmentInfo メソッドを呼び出します。
例
次の例は、直近の正式な評価の概要情報を取得する方法を示しています。この例では、評価の日付、基本スコア、状態情報を取得します。
#include <windows.h>
#include <stdio.h>
#include <winsatcominterfacei.h>
#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "oleaut32.lib")
void main(void)
{
HRESULT hr = S_OK;
IQueryRecentWinSATAssessment* pAssessment;
IProvideWinSATResultsInfo* pResults = NULL;
float baseScore = 0.0;
WINSAT_ASSESSMENT_STATE state;
VARIANT vAssessmentDate;
SYSTEMTIME st;
hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
// 直近の正式な評価のインスタンスを取得します。
hr = CoCreateInstance(__uuidof(CQueryWinSAT),
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(IQueryRecentWinSATAssessment),
(void**)&pAssessment);
if (FAILED(hr))
{
wprintf(L"Failed to create an instance of IQueryRecentWinSATAssessment. Failed with 0x%x.\n", hr);
goto cleanup;
}
// 評価の概要情報を取得します。
hr = pAssessment->get_Info(&pResults);
if (FAILED(hr))
{
wprintf(L"pAssessment->get_Info failed with 0x%x.\n", hr);
goto cleanup;
}
// 評価の状態を取得します。状態が有効な場合は、
// 評価の日付と基本スコアを出力します。
hr = pResults->get_AssessmentState(&state);
if (FAILED(hr))
{
wprintf(L"pResults->get_AssessmentState failed with 0x%x.\n", hr);
goto cleanup;
}
switch(state)
{
case WINSAT_ASSESSMENT_STATE_UNKNOWN:
wprintf(L"The state of the assessment is unknown.\n");
break;
case WINSAT_ASSESSMENT_STATE_VALID:
case WINSAT_ASSESSMENT_STATE_INCOHERENT_WITH_HARDWARE:
hr = pResults->get_AssessmentDateTime(&vAssessmentDate);
if (FAILED(hr))
{
wprintf(L"pResults->get_AssessmentDateTime failed with 0x%x.\n", hr);
break;
}
VariantTimeToSystemTime(vAssessmentDate.dblVal, &st);
wprintf(L"Assessment ran on %2d/%2d/%2d at %2d:%2d\n",
st.wMonth, st.wDay, st.wYear, st.wHour, st.wMinute);
hr = pResults->get_SystemRating(&baseScore);
if (SUCCEEDED(hr))
{
wprintf(L"The base score for the computer is %.1f\n", baseScore);
if (WINSAT_ASSESSMENT_STATE_INCOHERENT_WITH_HARDWARE == state)
{
wprintf(L"Note that the hardware configuration of the computer has changed\n"
L"since the assessment was run; the score reflects the prior configuration.");
}
}
else
{
wprintf(L"pResults->get_SystemRating failed with 0x%x.\n", hr);
}
break;
case WINSAT_ASSESSMENT_STATE_NOT_AVAILABLE:
wprintf(L"A formal assessment has not run on the computer.\n");
break;
case WINSAT_ASSESSMENT_STATE_INVALID:
wprintf(L"The assessment data is not valid.\n");
break;
default:
wprintf(L"The assessment state value is not valid.\n");
}
cleanup:
if (pAssessment)
pAssessment->Release();
if (pResults)
pResults->Release();
VariantClear(&vAssessmentDate);
CoUninitialize();
}
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IQueryRecentWinSATAssessment "{F8AD5D1F-3B47-4BDC-9375-7C6B1DA4ECA7}"
#usecom global IQueryRecentWinSATAssessment IID_IQueryRecentWinSATAssessment "{}"
#comfunc global IQueryRecentWinSATAssessment_get_XML 7 wstr,wstr,sptr
#comfunc global IQueryRecentWinSATAssessment_get_Info 8 sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。
; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。