COM physical return value
All COM/DCOM functions written in IDL should return a result code as raw result value. This return is of type HRESULT. A HRESULT code of S_OK/zero means that the function returns a success. This is however not the actual return value of the function. This return value is called physical or raw return value. This is used to know if the fuction has encountered any error. This return value is not considered as actual return in client. Client can check error condition and process error handing. Below are some of very common result codes returned by IDL functions.
Name | Description | Value |
S_OK | Operation successful | 0x00000000 |
E_ABORT | Operation aborted | 0x80004004 |
E_ACCESSDENIED | General access denied error | 0x80070005 |
E_FAIL | Unspecified failure | 0x80004005 |
E_HANDLE | Handle that is not valid | 0x80070006 |
E_INVALIDARG | One or more arguments are not valid | 0x80070057 |
E_NOINTERFACE | No such interface supported | 0x80004002 |
E_NOTIMPL | Not implemented | 0x80004001 |
E_OUTOFMEMORY | Failed to allocate necessary memory | 0x8007000E |
E_POINTER | Pointer that is not valid | 0x80004003 |
E_UNEXPECTED | Unexpected failure | 0x8000FFFF |
IDL functions and HRESULT
interface ICalculate : IDispatch { [propget, id(1), helpstring("Operand1 of calculator")] HRESULT Operand1([out, retval] long *pVal); [propput, id(1), helpstring("Operand1 of calculator")] HRESULT Operand1([in] long newVal); [propget, id(2), helpstring("Operand2 of calculator")] HRESULT Operand2([out, retval] long *pVal); [propput, id(2), helpstring("Operand2 of calculator")] HRESULT Operand2([in] long newVal); [id(3), helpstring("calculator main Operation method")] HRESULT DoOperation([in] char operation); [propget, id(4), helpstring("Result of calculator")] HRESULT Result([out, retval] long *pVal); };
C++ functions and HRESULT
virtual HRESULT __stdcall get_Operand1 (long * pVal ) = 0; virtual HRESULT __stdcall put_Operand1 (long pVal ) = 0; virtual HRESULT __stdcall get_Operand2 (long * pVal ) = 0; virtual HRESULT __stdcall put_Operand2 (long pVal ) = 0; virtual HRESULT __stdcall raw_DoOperation (char operation ) = 0; virtual HRESULT __stdcall get_Result (long * pVal ) = 0;
COM logical return value
COM function can optionally have a return value to the client. Return arguments are marked as [out,retval] in IDL. A function with void return type will not have any [out,retval]. These return arguments are called logical return to client. We have equivalent wrapped functions as below and we see the logical returns values of each "GET" functions. "PUT" functions being a void return will never have any logical return. Client should check the HRESULT code for S_OK / success before processing the logical return value.
Wrapped fucntions
long GetOperand1 ( ); void PutOperand1 (long pVal); long GetOperand2 ( ); void PutOperand2 (long pVal); HRESULT DoOperation (char operation); long GetResult ( );
HRESULT and error handling
inline long ICalculate::GetOperand1 ( ) { long _result; HRESULT _hr = get_Operand1(&_result); if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this)); return _result; } inline void ICalculate::PutOperand1 ( long pVal ) { HRESULT _hr = put_Operand1(pVal); if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this)); } inline long ICalculate::GetResult ( ) { long _result; HRESULT _hr = get_Result(&_result); if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this)); return _result; }
About our authors: Team EQA
You have viewed 1 page out of 67. Your COM/DCOM learning is 0.00% complete. Login to check your learning progress.
Learn on Youtube


Questions index C Questions C++ Questions Win32 MFC COM/DCOM DLL Questions