IQueryAllWinSATAssessments
COMIDispatch (デュアル)comobj 経由でメソッド名による遅延バインド呼び出しができます(vtableインデックス不要)。公式ドキュメント
すべての正式な WinSAT アセスメントに関する詳細を取得します。
メソッド 1
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 インターフェースのメンバーを使用して、アドホックなアセスメントからデータをクエリできます。
アセスメントが返される順序は不定です。
例
次の例は、XPath クエリを使用してアセスメントストア内の各正式なアセスメントからデータを取得する方法を示しています。
#include <windows.h>
#include <stdio.h>
#include <comutil.h>
#include <winsatcominterfacei.h>
#pragma comment(lib, "comsupp.lib") // For _bstr_t
void main(void)
{
HRESULT hr = S_OK;
IQueryAllWinSATAssessments* pAssessment;
IXMLDOMNodeList* pNodes = NULL;
IXMLDOMNode* pMemory = NULL;
IXMLDOMNode* pNode = NULL;
_bstr_t bstrXPath = L"WinsatAssessments/WinSAT/SystemConfig/Memory";
_bstr_t bstrAvailableRAM;
_bstr_t bstrTotalRAM;
hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
// Get an instance to the most recent formal assessment.
hr = CoCreateInstance(__uuidof(CQueryAllWinSAT),
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(IQueryAllWinSATAssessments),
(void**)&pAssessment);
if (FAILED(hr))
{
wprintf(L"Failed to create an instance of IQueryAllWinSATAssessments. Failed with 0x%x.\n", hr);
goto cleanup;
}
// Query the assessments for the memory nodes.
hr = pAssessment->get_AllXML(bstrXPath, NULL, &pNodes);
if (FAILED(hr))
{
wprintf(L"pAssessment->get_XML failed with 0x%x.\n", hr);
goto cleanup;
}
hr = pNodes->nextNode(&pMemory);
// Loop through the memory nodes and get available and total memory size
// values and print them.
while (pMemory)
{
hr = pMemory->selectSingleNode(L"TotalPhysical/Size", &pNode);
if (FAILED(hr))
{
wprintf(L"pMemory->selectSingleNode(TotalPhysical/Size) failed with 0x%x.\n", hr);
goto cleanup;
}
hr = pNode->get_text(bstrTotalRAM.GetAddress());
if (FAILED(hr))
{
wprintf(L"pNode->get_text(bstrTotalRAM) failed with 0x%x.\n", hr);
goto cleanup;
}
pNode->Release();
pNode = NULL;
hr = pMemory->selectSingleNode(L"AvailablePhysical/Size", &pNode);
if (FAILED(hr))
{
wprintf(L"pMemory->selectSingleNode(AvailablePhysical/Size) failed with 0x%x.\n", hr);
goto cleanup;
}
hr = pNode->get_text(bstrAvailableRAM.GetAddress());
if (FAILED(hr))
{
wprintf(L"pNode->get_text(bstrAvailableRAM) failed with 0x%x.\n", hr);
goto cleanup;
}
pNode->Release();
pNode = NULL;
wprintf(L"Available RAM: %s of %s\n", bstrAvailableRAM.GetBSTR(), bstrTotalRAM.GetBSTR());
pMemory->Release();
pMemory = NULL;
hr = pNodes->nextNode(&pMemory);
}
cleanup:
if (pAssessment)
pAssessment->Release();
if (pNodes)
pNodes->Release();
if (pMemory)
pMemory->Release();
if (pNode)
pNode->Release();
CoUninitialize();
}
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IQueryAllWinSATAssessments "{0B89ED1D-6398-4FEA-87FC-567D8D19176F}"
#usecom global IQueryAllWinSATAssessments IID_IQueryAllWinSATAssessments "{}"
#comfunc global IQueryAllWinSATAssessments_get_AllXML 7 wstr,wstr,sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。
; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。