Обработка возвращаемых значений ошибок WinAPI

В настоящее время я изучаю C ++ в связи с WinAPI. Я изо всех сил пытаюсь придумать значимую стратегию обработки ошибок для функций WinAPI.

ПРОБЛЕМА:

Большинство функций WinAPI могут возвращать 0 в случае ошибки, но во многих случаях я не вижу никакой информации на MSDN относительно того, что могло вызвать такую ​​ошибку и как ее устранить / устранить. принятие GetCursorPos В качестве примера:

Возвращает ненулевое значение в случае успеха или ноль в противном случае. Чтобы получить расширенную информацию об ошибке, позвоните GetLastError.

(…)

Рабочий стол ввода должен быть текущим рабочим столом при вызове GetCursorPos. Вызов OpenInputDesktop определить, является ли текущий рабочий стол входным рабочим столом. Если это не так, позвоните SetThreadDesktop с HDESK вернулся OpenInputDesktop переключиться на этот рабочий стол.

  • Если я буду следовать по маршруту GetLastError Меня интересует, какие ошибки могут быть возвращены этой конкретной функцией, чтобы я мог проверить, что с ними можно сделать. Но коды ошибок организованы на этом Страница MSDN на 10 групп на основе только номера ошибки и без каких-либо уточнений, какие ошибки перечислены в какой группе.
  • Когда я попытался выяснить, как бы OpenInputDesktop помогите мне сделать мой код более пуленепробиваемым, я обнаружил это снова:

Если функция не работает, возвращаемое значение НОЛЬ. Чтобы получить расширенную информацию об ошибке, позвоните GetLastError.

Подвести итог: почти каждая функция в WinAPI может возвращать значение, определяющее возникновение ошибки, и я могу получить информацию об ошибке когда это произойдет с помощью GetLastError функция. Но нет никакой информации о том, какие ошибки я могу ожидать и какие шаги предпринять для их устранения.

Примеров много, GetWindowRect также широко используется и MSDN предоставляет ту же ограниченную информацию, что и для GetCursorPos,

ВОПРОС:

Пожалуйста, существуют ли какие-либо стандарты того, как подходить к возвращаемым значениям ошибок функции WinAPI, чтобы обработка ошибок не превращалась в отображение окна сообщения и выход из приложения? Спасибо!

0

Решение

Поскольку заранее известно, какие возможные коды ошибок могут быть возвращены конкретной функцией, я боюсь, что Microsoft давно решила, что поддержка такой документации для всех функций будет слишком громоздкой и дорогостоящей, так как функция API может вызывать любую количество других функций API, которые в свою очередь могут вызывать другие и так далее. Иногда вам везет, и документ MSDN вызывает коды ошибок, характерные для этой функции, как в случае с ReadFile но это не относится ко всем функциям, как вы заметили.

При этом стандартный способ работы с кодами ошибок, возвращаемыми GetLastError() это к отформатируйте их с помощью FormatMessage.

Если вы передали LANG_USER_DEFAULT для lang ID, это вернет иногда полезное, иногда не очень полезное сообщение об ошибке, отформатированное в выбранной пользователем локали из кода ошибки. Вы можете показать это сообщение пользователю. Если вы хотите отформатировать его на своем родном языке для целей ведения журнала, предполагая, что это английский, вы должны передать MAKELANGID (LANG_ENGLISH, SUBLANG_ENGLISH_US) для идентификатора языка.

И это лучшее, что вы можете сделать, если коды ошибок не задокументированы, и вы не сталкивались с ними при тестировании: зарегистрируйте их и получите журнал с другой отладочной информацией, прикрепленной к отчету о проблеме.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]