Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
The InvokeAction and QueryStateVariable methods return HRESULT values that might indicate a device error (that is, an error that is received from a UPnP-certified device). If an error is received from a device, the method (InvokeAction or QueryStateVariable) returns an HRESULT value that is based on the device error code, as explained in this topic. Because a conversion is applied to the device error code to produce an HRESULT value, you cannot read the device error code directly from the HRESULT value.
Conversion of a Device Error Code to an HRESULT
There are both standard and non-standard device error codes. The standard codes have the same meaning across all UPnP-certified devices and have values that are less than 600. The non-standard codes are vendor-specific and have values ranging from 600 through 899.
Whether or not the device error code is standard determines how the HRESULT value is generated:
- A standard device error code is mapped to an HRESULT value.
- A non-standard device error code is embedded in the HRESULT value by applying a formula.
Both of these procedures can be reversed to determine the device error code from a particular HRESULT value.
Deriving a Device Error Code from an HRESULT Value
If the HRESULT value is greater than or equal to UPNP_E_ACTION_SPECIFIC_BASE (0x80040300) and less than or equal to UPNP_E_ACTION_SPECIFIC_MAX (0x8004042B), the device error code is nonstandard — use the formula in the following section to determine the error code. Otherwise, the device error code is standard — use the table in the Mapping for Standard Device Error Codes section, which provides the mapping from the HRESULT value to the device error code.
For a text description of the error after a call to IUPnPService::InvokeAction, set the pvarRetVal parameter to an empty array. Upon return, this parameter will contain a text description of the error, if any occurred.
Formula for Nonstandard Device Error Codes
Use the following formula if UPNP_E_ACTION_SPECIFIC_BASE ≤ HRESULT ≤UPNP_E_ACTION_SPECIFIC_MAX.
Device Error Code = (HRESULT - UPNP_E_ACTION_SPECIFIC_BASE) + FAULT_ACTION_SPECIFIC_BASE
Substituting the actual numeric values, the equation is: Device Error Code = (HRESULT - 0x80040300) + 0x0258
Mapping for Standard Device Error Codes
Use the following mapping if HRESULT < UPNP_E_ACTION_SPECIFIC_BASE.
HRESULT value | Device Error Code | Actual value |
---|---|---|
UPNP_E_INVALID_ACTION | FAULT_INVALID_ACTION | 401 |
UPNP_E_INVALID_ARGUMENTS | FAULT_INVALID_ARG | 402 |
UPNP_E_OUT_OF_SYNC | FAULT_INVALID_SEQUENCE_NUMBER | 403 |
UPNP_E_INVALID_VARIABLE | FAULT_INVALID_VARIABLE | 404 |
UPNP_E_ACTION_REQUEST_FAILED | FAULT_DEVICE_INTERNAL_ERROR | 501 |
More Information
Device error codes are specified in "UPnP Device Architecture version 1.0". The constants mentioned in this topic are defined in the files Upnp.h and Upnp.idl.