views:

95

answers:

2

I have a function that returns a different DWORD value for each case there is an error. So I have the following defines:

#define ERR_NO_DB_CONNECTION    0x90000
#define ERR_DB_NOT_OPEN         0x90001
#define ERR_DB_LOCKED           0x90002
#define ERR_DB_CONN_LOST        0x90003

Now, I return those values when an error occurs. I need to also return the value of GetLastError in the same return.

No, I can't read it later.

I tried combining it different ways, eg:

return ERR_DB_NOT_OPEN + GetLastError();

and then extract the error by subtracting the value of ERR_DB_NOT_OPEN but since I need to use this in functions where there can be several return values it can get quite complex to do that.

Is there any way to achieve this? I mean, combine the value + GetLastError and extract them later? Code is appreciated.

Thanks

Jess.

A: 

You can combine them into a string (a char array) and then split them from the caller.

Maurizio Reginelli
+1  A: 

According to Microsoft's documentation, the system error codes max out at 15999 (0x3E7F). This means you have the entire upper word to play with. You'll need to shorten your error codes to fit into 4 hex digits, then you can use some Windows macros to combine and split them:

return MAKELPARAM(GetLastError(), ERR_DB_NOT_OPEN);

int lasterror = LOWORD(result);
int code = HIWORD(result);
Mark Ransom
That's not quite true. The upper bits are used to encode severity, facility, and so on. See winerror.h.
500 - Internal Server Error
Those are only the currently existing error codes; Microsoft reserves the right to add new error codes in the future.
Luke