/////////////////////////////////////////////////////////////////////////////
/// CreateChainedErrorInfo - Creates chained error info structure
CHAINEDEIAPI HRESULT __stdcall CreateChainedErrorInfo(HRESULT hrInner, REFGUID guid, 
                                                      LPCOLESTR pszSource, LPCOLESTR pszDescription, 
                                                      LPCOLESTR pszHelpFile, DWORD dwHelpContext, 
                                                      IErrorInfo** ppErrorInfo)
{
	HRESULT hr;

	if(ppErrorInfo == NULL) return E_POINTER;
	*ppErrorInfo = NULL;

	// Get existing error info
	CComPtr<IErrorInfo> spErrorInfo;
	hr = GetErrorInfo(0, &spErrorInfo);
	if(FAILED(hr)) return hr;

	// Create custom error info implementation
	CComObject< CErrorInfoImpl >* pErrorInfo = NULL;
	hr = CComObject< CErrorInfoImpl >::CreateInstance(&pErrorInfo);
	if(FAILED(hr)) return hr;

	// Initialize
	pErrorInfo->AddRef();

	hr = pErrorInfo->Initialize(hrInner, guid, pszSource, pszDescription, pszHelpFile, dwHelpContext, spErrorInfo);
	if(SUCCEEDED(hr))
	{
		hr = pErrorInfo->QueryInterface(ppErrorInfo);
	}

	pErrorInfo->Release();

	return hr;
}