Преобразовать значения ошибок errno.h в эквиваленты Win32 GetLastError()

Я пишу слой между файловой системой POSIX и Windows, используя Dokan, и мне нужно преобразовать значения ошибок вида errno (EINVAL, ENOENT и т. д.), к эквивалентам Win32, которые вы получите при вызове GetLastError() (такие как ERROR_INVALID_PARAMETER).

Существует ли какая-либо функция, библиотека или ссылка, которые я могу использовать для выполнения этих преобразований?

Я обычно просматриваю исходный код Python для вдохновения по этим вопросам, но Python аккуратно избегает этой необходимости (по крайней мере, насколько я могу судить).

В качестве примера, EINVAL (22) будет преобразован в ERROR_INVALID_PARAMETER (87),

2 ответа

Решение

В прошлом я проводил эксперимент по этому вопросу, в основном на основе модуля Microsoft DOSMAP.CPP. Однако я отменил проект в то время, потому что отображение ошибок не всегда было правильным для определенных кодов ошибок. Например, не каждая версия POSIX возвращает EINVAL за ERROR_INVALID_ACCESS некоторые из них возвращаются EACCES вместо. Я также провел сравнение между номерами системных ошибок errno.h в POSIX.1-2008 и DOSMAP.CPP, mingw.c, Postgresql error.c, tclWinError.c, MySQL. my_winerr.c и многое другое; иногда правила отображения различаются среди них для конкретных кодов ошибок. Лично я предлагаю вам иметь дело только с согласованным отображением кода ошибки среди них.

Для каждого errno Есть в общем много возможных GetLastError ценности, так что то, что вы думаете, не обязательно может быть осуществимым.

Во всяком случае, я просто погуглил "errno to getlasterror", и первый хит от Google предоставил этот список корреспонденции из источников Cygwin.

Это неправильный путь, GetLastError в errno, но, возможно, полезно?

Ура & hth.

Другие вопросы по тегам