핸드오프를 사용하여 NDF 도우미 클래스 확장
이 도우미 클래스는 첫 번째 예제에서 코딩된 SimpleFileHelperClass에 대한 낮은 상태 종속성을 가합니다.
두 번째 핸드오프 도우미 클래스는 진단 자체를 수행하지 않는 간단한 통과 도우미 클래스입니다. 대신 SimpleFileHelperClass에 대한 더 낮은 상태 가설을 항상 생성합니다. 이는 이 도우미 클래스에서 향후 진단 기능을 추가하기 위한 자리 표시자 역할을 하는 데 유용합니다. 핸드오프 도우미 클래스는 두 가지 메서드를 구현합니다.
LowHealth 메서드는 진단 상태를 DS_INDETERMINATE 설정하는 데 사용됩니다. 이렇게 하면 NDF가 GetLowerHypotheses를 호출합니다.
#include <windows.h>
HRESULT HandOffTestHelperClass::LowHealth(
/* [unique][string][in] */ LPCWSTR pwszInstanceDescription,
/* [string][out] */ LPWSTR *ppwszDescription,
/* [out] */ long *pDeferredTime,
/* [out] */ DIAGNOSIS_STATUS *pStatus)
{
*pStatus = DS_INDETERMINATE;
return S_OK;
}
다음으로, GetLowerHypotheses는 진단할 도우미 클래스를 NDF에 알리기 위해 구현됩니다.
#include <windows.h>
HRESULT HandOffTestHelperClass::GetLowerHypotheses(
ULONG *Count,
HYPOTHESIS **Hypotheses)
{
HRESULT hr = S_OK;
HYPOTHESIS *pHypothesis=NULL;
HELPER_ATTRIBUTE *pAttr=NULL;
pHypothesis = (PHYPOTHESIS)CoTaskMemAlloc(sizeof(HYPOTHESIS));
if (pHypothesis == NULL)
{
return E_OUTOFMEMORY;
}
SecureZeroMemory(pHypothesis, sizeof(HYPOTHESIS));
pAttr = (PHELPER_ATTRIBUTE)CoTaskMemAlloc(sizeof(HELPER_ATTRIBUTE));
if (pAttr == NULL)
{
hr = E_OUTOFMEMORY;
goto Error;
}
SecureZeroMemory(pAttr, sizeof(HELPER_ATTRIBUTE));
//set the helper class name to hand off to
hr = StringCchCopyWithAlloc(&pHypothesis->pwszClassName, MAX_PATH,
L"SimpleFileHelperClass");
if (FAILED(hr))
{
goto Error;
}
//populate the attribute
//set the attribute name
hr = StringCchCopyWithAlloc(&pAttr->pwszName, MAX_PATH, L"filename");
if (FAILED(hr))
{
goto Error;
}
//set attribute data
pAttr->type = AT_STRING;
hr = StringCchCopyWithAlloc(&pAttr->PWStr, MAX_PATH, m_pwszTestFile);
if (FAILED(hr))
{
goto Error;
}
//set the attributes to the hypothesis
pHypothesis->celt = 1; //number of attributes
pHypothesis->rgAttributes=pAttr;
//pass data back
*pcelt = 1; //one hypothesis
*pprgHypotheses = pHypothesis;
return S_OK;
Error:
if (pAttr)
{
if (pAttr->PWStr)
CoTaskMemFree(pAttr->PWStr);
if (pAttr->pwszName)
CoTaskMemFree(pAttr->pwszName);
}
if (pHypothesis)
{
if (pHypothesis->pwszClassName)
CoTaskMemFree(pHypothesis->pwszClassName);
CoTaskMemFree(pHypothesis);
}
return hr;
}