static HRESULT WINAPI ISupportErrorInfoImpl_QueryInterface( ISupportErrorInfo* iface, REFIID riid, VOID** ppvoid) { ErrorInfoImpl *This = impl_from_ISupportErrorInfo(iface); return IErrorInfo_QueryInterface(&This->IErrorInfo_iface, riid, ppvoid); }
/** * Print detailed error information if available. * @param pszExecutable string with the executable name * @param pszErrorMsg string containing the code location specific error message * @param rc COM/XPCOM result code */ static void PrintErrorInfo(const char *pszExecutable, const char *pszErrorMsg, HRESULT rc) { IErrorInfo *ex; HRESULT rc2 = S_OK; fprintf(stderr, "%s: %s (rc=%#010x)\n", pszExecutable, pszErrorMsg, (unsigned)rc); rc2 = g_pVBoxFuncs->pfnGetException(&ex); if (SUCCEEDED(rc2)) { IVirtualBoxErrorInfo *ei; rc2 = IErrorInfo_QueryInterface(ex, &IID_IVirtualBoxErrorInfo, (void **)&ei); if (FAILED(rc2)) ei = NULL; if (ei) { /* got extended error info, maybe multiple infos */ do { LONG resultCode = S_OK; BSTR componentUtf16 = NULL; char *component = NULL; BSTR textUtf16 = NULL; char *text = NULL; IVirtualBoxErrorInfo *ei_next = NULL; fprintf(stderr, "Extended error info (IVirtualBoxErrorInfo):\n"); IVirtualBoxErrorInfo_get_ResultCode(ei, &resultCode); fprintf(stderr, " resultCode=%#010x\n", (unsigned)resultCode); IVirtualBoxErrorInfo_get_Component(ei, &componentUtf16); g_pVBoxFuncs->pfnUtf16ToUtf8(componentUtf16, &component); g_pVBoxFuncs->pfnComUnallocString(componentUtf16); fprintf(stderr, " component=%s\n", component); g_pVBoxFuncs->pfnUtf8Free(component); IVirtualBoxErrorInfo_get_Text(ei, &textUtf16); g_pVBoxFuncs->pfnUtf16ToUtf8(textUtf16, &text); g_pVBoxFuncs->pfnComUnallocString(textUtf16); fprintf(stderr, " text=%s\n", text); g_pVBoxFuncs->pfnUtf8Free(text); rc2 = IVirtualBoxErrorInfo_get_Next(ei, &ei_next); if (FAILED(rc2)) ei_next = NULL; IVirtualBoxErrorInfo_Release(ei); ei = ei_next; } while (ei); } IErrorInfo_Release(ex); g_pVBoxFuncs->pfnClearException(); } }
/*********************************************************************** * CreateErrorInfo (OLE32.@) * * Creates an object used to set details for an error info object. * * PARAMS * pperrinfo [O]. Address where error info creation object will be stored. * * RETURNS * Success: S_OK. * Failure: HRESULT code. */ HRESULT WINAPI CreateErrorInfo(ICreateErrorInfo **pperrinfo) { IErrorInfo * pei; HRESULT res; TRACE("(%p)\n", pperrinfo); if(! pperrinfo ) return E_INVALIDARG; if(!(pei=IErrorInfoImpl_Constructor()))return E_OUTOFMEMORY; res = IErrorInfo_QueryInterface(pei, &IID_ICreateErrorInfo, (LPVOID*)pperrinfo); IErrorInfo_Release(pei); return res; }
static void test_error_info(void) { HRESULT hr; ICreateErrorInfo *pCreateErrorInfo; IErrorInfo *pErrorInfo; static WCHAR wszDescription[] = {'F','a','i','l','e','d',' ','S','p','r','o','c','k','e','t',0}; static WCHAR wszHelpFile[] = {'s','p','r','o','c','k','e','t','.','h','l','p',0}; static WCHAR wszSource[] = {'s','p','r','o','c','k','e','t',0}; IUnknown *unk; hr = CreateErrorInfo(&pCreateErrorInfo); ok_ole_success(hr, "CreateErrorInfo"); hr = ICreateErrorInfo_QueryInterface(pCreateErrorInfo, &IID_IUnknown, (void**)&unk); ok_ole_success(hr, "QI"); IUnknown_Release(unk); hr = ICreateErrorInfo_SetDescription(pCreateErrorInfo, NULL); ok_ole_success(hr, "ICreateErrorInfo_SetDescription"); hr = ICreateErrorInfo_SetDescription(pCreateErrorInfo, wszDescription); ok_ole_success(hr, "ICreateErrorInfo_SetDescription"); hr = ICreateErrorInfo_SetGUID(pCreateErrorInfo, &CLSID_WineTest); ok_ole_success(hr, "ICreateErrorInfo_SetGUID"); hr = ICreateErrorInfo_SetHelpContext(pCreateErrorInfo, 0xdeadbeef); ok_ole_success(hr, "ICreateErrorInfo_SetHelpContext"); hr = ICreateErrorInfo_SetHelpFile(pCreateErrorInfo, NULL); ok_ole_success(hr, "ICreateErrorInfo_SetHelpFile"); hr = ICreateErrorInfo_SetHelpFile(pCreateErrorInfo, wszHelpFile); ok_ole_success(hr, "ICreateErrorInfo_SetHelpFile"); hr = ICreateErrorInfo_SetSource(pCreateErrorInfo, NULL); ok_ole_success(hr, "ICreateErrorInfo_SetSource"); hr = ICreateErrorInfo_SetSource(pCreateErrorInfo, wszSource); ok_ole_success(hr, "ICreateErrorInfo_SetSource"); hr = ICreateErrorInfo_QueryInterface(pCreateErrorInfo, &IID_IErrorInfo, (void **)&pErrorInfo); ok_ole_success(hr, "ICreateErrorInfo_QueryInterface"); hr = IErrorInfo_QueryInterface(pErrorInfo, &IID_IUnknown, (void**)&unk); ok_ole_success(hr, "QI"); IUnknown_Release(unk); ICreateErrorInfo_Release(pCreateErrorInfo); hr = SetErrorInfo(0, pErrorInfo); ok_ole_success(hr, "SetErrorInfo"); IErrorInfo_Release(pErrorInfo); pErrorInfo = NULL; hr = GetErrorInfo(0, &pErrorInfo); ok_ole_success(hr, "GetErrorInfo"); IErrorInfo_Release(pErrorInfo); hr = GetErrorInfo(0, &pErrorInfo); ok(hr == S_FALSE, "GetErrorInfo should have returned S_FALSE instead of 0x%08x\n", hr); ok(!pErrorInfo, "pErrorInfo should be set to NULL\n"); hr = SetErrorInfo(0, NULL); ok_ole_success(hr, "SetErrorInfo"); hr = GetErrorInfo(0xdeadbeef, &pErrorInfo); ok(hr == E_INVALIDARG, "GetErrorInfo should have returned E_INVALIDARG instead of 0x%08x\n", hr); hr = SetErrorInfo(0xdeadbeef, NULL); ok(hr == E_INVALIDARG, "SetErrorInfo should have returned E_INVALIDARG instead of 0x%08x\n", hr); }
static HRESULT WINAPI errorrec_QueryInterface(IErrorRecords *iface, REFIID riid, void **ppvObject) { errorrecords *This = impl_from_IErrorRecords(iface); return IErrorInfo_QueryInterface(&This->IErrorInfo_iface, riid, ppvObject); }