Объединение значения GetLastaRasterror и пользовательского сообщения об ошибке
-
02-10-2019 - |
Вопрос
У меня есть функция, которая возвращает другое значение DWORD для каждого случая, есть ошибка. Поэтому у меня есть следующие определяющие:
#define ERR_NO_DB_CONNECTION 0x90000
#define ERR_DB_NOT_OPEN 0x90001
#define ERR_DB_LOCKED 0x90002
#define ERR_DB_CONN_LOST 0x90003
Теперь я возвращаю эти значения, когда возникает ошибка. Мне нужно также вернуть стоимость getlasterror в том же возврате.
Нет, я не могу прочитать его позже.
Я пытался объединить его разными способами, например:
return ERR_DB_NOT_OPEN + GetLastError();
А затем извлечь ошибку, вычитая значение err_db_not_open, но поскольку мне нужно использовать это в функциях, где могут быть несколько возвратных значений, которые он может получить довольно сложно, чтобы сделать это.
Есть ли способ достичь этого? Я имею в виду, комбинируйте значение + Getlasterror и извлечь их позже? Код ценится.
Спасибо
Джесс.
Решение
В соответствии с Документация Microsoft, Системные коды ошибок максимум выходят на 15999 (0x3e7f). Это означает, что у вас есть все верхнее слово для игры. Вам нужно будет сократить коды ошибок, чтобы вписаться в 4 шестнадцатеричных цифры, вы можете использовать несколько макросов Windows для объединения и разделения их:
return MAKELPARAM(GetLastError(), ERR_DB_NOT_OPEN);
int lasterror = LOWORD(result);
int code = HIWORD(result);
Другие советы
Я знаю, что этот пост старый, но на всякий случай ... дополняя ответ Марка. Для вас доступна следующая кодовая область для определения собственных ошибок.
Коды ошибок - это 32-битные значения (бит 31 - самый значительный бит). Бит 29 зарезервирован для определенных нанесенных кодов ошибок; Ни один код ошибки системы не имеет этого бита. Если вы определяете код ошибки для вашего приложения, установите этот бит, чтобы указать, что код ошибки был определен вашим приложением, и убедиться, что ваш код ошибки не конфликтует с любыми системами ошибок.
https://msdn.microsoft.com/en-us/library/windows/desktop/ms680627%28v=vs.85%29.aspx.
Вы можете объединить их в строку (массив CHAR), а затем разделить их из звонящего.