List of GetLastError() error codes for every winapi function

Some API calls provide a partial list of error codes they can return. On those cases it is part of the documented contract, and your code can be written to account for those error codes. Keep in mind, that those lists are usually never complete, so your code needs to be prepared to deal with other error codes as well.

In short, error handling needs to be implemented on a case-by-case basis. There are common patterns, but there is no single catch-all implementation.

Вступление

API Windows предоставляется с помощью C-вызываемого интерфейса. Успех или сбой вызова API сообщаются строго через возвращаемые значения. Исключения не являются частью документированного контракта (хотя некоторые реализации API могут вызывать исключения SEH , например, при передаче аргумента lpCommandLine только для чтения в CreateProcess ).

Сообщение об ошибке грубо относится к одной из четырех категорий:

  • Только возвращаемое значение
  • Возвращаемое значение с дополнительной информацией о сбое
  • Возвращаемое значение с дополнительной информацией об отказе и успехе
  • Возвращаемое значение HRESULT

Документация для каждого вызова API явно вызывается, как сообщаются ошибки. Всегда обращайтесь к документации.

Delphi Xe.

in delphi help: “. Calling this function usually resets the operating system error state

How to reset a current error on 0? I. that GetLastError=0

6,9145 gold badges32 silver badges50 bronze badges

asked Jul 2, 2011 at 17:40

You should only be calling GetLastError when there has actually been an error. Some Windows API functions will reset the error to 0 on success, some won’t. Either way, you should only interrogate the error state when you need to know the most recent error.

Note that there is a SetLastError method as well, but that doesn’t help you; if you set the last error to 0, then of course GetLastError will return 0.

answered Jul 2, 2011 at 17:45

2k5 gold badges122 silver badges132 bronze badges

This is an example of low quality documentation. GetLastError WinAPI function will retain its return value until next call of SetLastError so repeatedly invoking will have no effect.

SetLastError(42);
for I := 1 to 100 do
Assert(GetLastError() = 42); // all of those assertions evaluates to True

Also, in Delphi documentation GetLastError has been misplaced into exception handling routines; this is wrong too, these error handling mechanisms are unrelated to each other.

On that silly “usually” word in the reference: It happens because function used to output GetLastError return value invokes SetLastError. Eg:

answered Jul 2, 2011 at 19:55

Функция GetLastError
извлекает значение кода последней ошибки
вызывающего потока. Код последней ошибки
сохраняется при посредстве базового
компонента потока. Многие потоки не
записывают поверх друг друга коды
последней ошибки.

Visual Basic: Прикладные
программы должны вызывать err. LastDllError вместо GetLastError.

Возвращаемые значения

Величина возвращаемого значения является
значение кода последней ошибки вызывающего
потока. Функции устанавливают это значение
путем вызова функция SetLastError. Раздел Возвращаемые значения каждой
статьи справочника по функциям обращает
внимание на условия, при которых функция
устанавливает код последней ошибки.

Windows 95/98/Me: Функции, которые фактически
реализованы в 16-разрядном коде, не
устанавливают код последней ошибки. Вы
должны игнорировать код последней ошибки,
когда вызываете эти функции. Они включают в
себя функции управления окном, функции GDI
и функции мультимедийных
средств. Для функций, которые устанавливают
код последней ошибки, Вы не должны
надеяться на возврат
функцией GetLastError
того же самого значения и в среде Windows 95 /98/Me
и в среде Windows NT.

Замечания

Чтобы получить строку  для кодов
системных ошибок, используйте функцию FormatMessage. За полным перечнем кодов ошибок,
предусмотренных операционной системой, см. статью Коды
системных ошибок.

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

Читайте также:  Коды ошибок холодильника полаир ан

Вы должны вызвать функцию GetLastError
непосредственно тогда, когда величина
возвращаемого значения функции указывает,
что такой вызов даст вам полезную
информацию. Это делается потому, что
некоторые функции, когда они завершаются
успешно, вызывают функцию SetLastError
с нулем, чтобы ликвидировать код ошибки
установленный самой последней
неудавшейся функцией.

Большинство функций, которые
устанавливают последнее значение кода
ошибки потока, устанавливает его тогда,
когда они завершаются ошибкой; несколько
функций устанавливают код ошибки, когда они
завершаются успешно. Функция, которая
завершилась сбоем, обычно указывается
кодом ошибки величины возвращаемого
значения типа нуля, ПУСТО (NULL) или – (минус)1. Некоторые функции вызывают SetLastError
при условии успешного завершения; на такие
случаи обращается внимание в статьях
справочника для каждой функции.

Коды Ошибки – это 32-разрядные значения (бит
31 – старший значащий бит). Бит 29
зарезервирован для определяемых
программой кодов ошибок; нет ни одного кода
системных ошибок, которые бы имели
установленным этот бит. Если Вы определяете
код ошибки для своего приложения,
устанавливайте этот бит в единицу. Это
указывает, что код ошибки был задан
прикладной программой и гарантирует, что
ваш код ошибки не войдет в противоречие с
любыми кодами ошибок, определенными
системой.

Чтобы преобразовывать системную ошибку в
значение HRESULT,
используйте макрокоманду

HRESULT_FROM_WIN32.

Код примера

Пример смотри в статье Извлечение
кода последней ошибки.

Краткий обзор Обработка ошибок, Функции
обработки ошибок, FormatMessage,
HRESULT_FROM_WIN32,
SetLastError,
SetLastErrorEx

i’ll leave this here since i will need to use it later. It’s a source for a small binary compatible tool that will work equally well in assembly, C and C++.

GetErrorMessageLib. c (compiled to GetErrorMessageLib. dll)

inline version(GetErrorMessage. h):

dynamic usecase(assumed that error code is valid, otherwise a -1 check is needed):

regular use case(assumes error code is valid, otherwise -1 return check is needed):

example using with assembly gnu as in MinGW32(again, assumed that error code is valid, otherwise -1 check is needed).

result: The process cannot access the file because another process has locked a portion of the file.

GetLastError() – функция, возвращающая коды ошибок. Кодовые константы ошибок определены
в файле stderror. mqh. Для вывода текстовых сообщений следует использовать функцию
ErrorDescription(), определенную в файле stdlib. mqh.

КонстантаЗначениеОписание
ERR_NO_ERROR0Нет ошибки
ERR_NO_RESULT1Нет ошибки, но результат неизвестен
ERR_COMMON_ERROR2Общая ошибка
ERR_INVALID_TRADE_PARAMETERS3Неправильные параметры
ERR_SERVER_BUSY4Торговый сервер занят
ERR_OLD_VERSION5Старая версия клиентского терминала
ERR_NO_CONNECTION6Нет связи с торговым сервером
ERR_NOT_ENOUGH_RIGHTS7Недостаточно прав
ERR_TOO_FREQUENT_REQUESTS8Слишком частые запросы
ERR_MALFUNCTIONAL_TRADE9Недопустимая операция нарушающая функционирование сервера
ERR_ACCOUNT_DISABLED64Счет заблокирован
ERR_INVALID_ACCOUNT65Неправильный номер счета
ERR_TRADE_TIMEOUT128Истек срок ожидания совершения сделки
ERR_INVALID_PRICE129Неправильная цена
ERR_INVALID_STOPS130Неправильные стопы
ERR_INVALID_TRADE_VOLUME131Неправильный объем
ERR_MARKET_CLOSED132Рынок закрыт
ERR_TRADE_DISABLED133Торговля запрещена
ERR_NOT_ENOUGH_MONEY134Недостаточно денег для совершения операции
ERR_PRICE_CHANGED135Цена изменилась
ERR_OFF_QUOTES136Нет цен
ERR_BROKER_BUSY137Брокер занят
ERR_REQUOTE138Новые цены
ERR_ORDER_LOCKED139Ордер заблокирован и уже обрабатывается
ERR_LONG_POSITIONS_ONLY_ALLOWED140Разрешена только покупка
ERR_TOO_MANY_REQUESTS141Слишком много запросов
ERR_TRADE_MODIFY_DENIED145Модификация запрещена, так как ордер слишком близок к рынку
ERR_TRADE_CONTEXT_BUSY146Подсистема торговли занята
ERR_TRADE_EXPIRATION_DENIED147Использование даты истечения ордера запрещено брокером
ERR_TRADE_TOO_MANY_ORDERS148Количество открытых и отложенных ордеров достигло предела, установленного брокером.

КонстантаЗначениеОписание
ERR_NO_MQLERROR4000Нет ошибки
ERR_WRONG_FUNCTION_POINTER4001Неправильный указатель функции
ERR_ARRAY_INDEX_OUT_OF_RANGE4002Индекс массива – вне диапазона
ERR_NO_MEMORY_FOR_FUNCTION_CALL_STACK4003Нет памяти для стека функций
ERR_RECURSIVE_STACK_OVERFLOW4004Переполнение стека после рекурсивного вызова
ERR_NOT_ENOUGH_STACK_FOR_PARAMETER4005На стеке нет памяти для передачи параметров
ERR_NO_MEMORY_FOR_PARAMETER_STRING4006Нет памяти для строкового параметра
ERR_NO_MEMORY_FOR_TEMP_STRING4007Нет памяти для временной строки
ERR_NOT_INITIALIZED_STRING4008Неинициализированная строка
ERR_NOT_INITIALIZED_ARRAYSTRING4009Неинициализированная строка в массиве
ERR_NO_MEMORY_FOR_ARRAYSTRING4010Нет памяти для строкового массива
ERR_TOO_LONG_STRING4011Слишком длинная строка
ERR_REMAINDER_FROM_ZERO_DIVIDE4012Остаток от деления на ноль
ERR_ZERO_DIVIDE4013Деление на ноль
ERR_UNKNOWN_COMMAND4014Неизвестная команда
ERR_WRONG_JUMP4015Неправильный переход
ERR_NOT_INITIALIZED_ARRAY4016Неинициализированный массив
ERR_DLL_CALLS_NOT_ALLOWED4017Вызовы DLL не разрешены
ERR_CANNOT_LOAD_LIBRARY4018Невозможно загрузить библиотеку
ERR_CANNOT_CALL_FUNCTION4019Невозможно вызвать функцию
ERR_EXTERNAL_EXPERT_CALLS_NOT_ALLOWED4020Вызовы внешних библиотечных функций не разрешены
ERR_NOT_ENOUGH_MEMORY_FOR_RETURNED_STRING4021Недостаточно памяти для строки, возвращаемой из функции
ERR_SYSTEM_BUSY4022Система занята
ERR_INVALID_FUNCTION_PARAMETERS_COUNT4050Неправильное количество параметров функции
ERR_INVALID_FUNCTION_PARAMETER_VALUE4051Недопустимое значение параметра функции
ERR_STRING_FUNCTION_INTERNAL_ERROR4052Внутренняя ошибка строковой функции
ERR_SOME_ARRAY_ERROR4053Ошибка массива
ERR_INCORRECT_SERIES_ARRAY_USING4054Неправильное использование массива-таймсерии
ERR_CUSTOM_INDICATOR_ERROR4055Ошибка пользовательского индикатора
ERR_INCOMPATIBLE_ARRAYS4056Массивы несовместимы
ERR_GLOBAL_VARIABLES_PROCESSING_ERROR4057Ошибка обработки глобальныех переменных
ERR_GLOBAL_VARIABLE_NOT_FOUND4058Глобальная переменная не обнаружена
ERR_FUNCTION_NOT_ALLOWED_IN_TESTING_MODE4059Функция не разрешена в тестовом режиме
ERR_FUNCTION_NOT_CONFIRMED4060Функция не подтверждена
ERR_SEND_MAIL_ERROR4061Ошибка отправки почты
ERR_STRING_PARAMETER_EXPECTED4062Ожидается параметр типа string
ERR_INTEGER_PARAMETER_EXPECTED4063Ожидается параметр типа integer
ERR_DOUBLE_PARAMETER_EXPECTED4064Ожидается параметр типа double
ERR_ARRAY_AS_PARAMETER_EXPECTED4065В качестве параметра ожидается массив
ERR_HISTORY_WILL_UPDATED4066Запрошенные исторические данные в состоянии обновления
ERR_TRADE_ERROR4067Ошибка при выполнении торговой операции
ERR_END_OF_FILE4099Конец файла
ERR_SOME_FILE_ERROR4100Ошибка при работе с файлом
ERR_WRONG_FILE_NAME4101Неправильное имя файла
ERR_TOO_MANY_OPENED_FILES4102Слишком много открытых файлов
ERR_CANNOT_OPEN_FILE4103Невозможно открыть файл
ERR_INCOMPATIBLE_ACCESS_TO_FILE4104Несовместимый режим доступа к файлу
ERR_NO_ORDER_SELECTED4105Ни один ордер не выбран
ERR_UNKNOWN_SYMBOL4106Неизвестный символ
ERR_INVALID_PRICE_PARAM4107Неправильный параметр цены для торговой функции
ERR_INVALID_TICKET4108Неверный номер тикета
ERR_TRADE_NOT_ALLOWED4109Торговля не разрешена
ERR_LONGS_NOT_ALLOWED4110Длинные позиции не разрешены
ERR_SHORTS_NOT_ALLOWED4111Короткие позиции не разрешены
ERR_OBJECT_ALREADY_EXISTS4200Объект уже существует
ERR_UNKNOWN_OBJECT_PROPERTY4201Запрошено неизвестное свойство объекта
ERR_OBJECT_DOES_NOT_EXIST4202Объект не существует
ERR_UNKNOWN_OBJECT_TYPE4203Неизвестный тип объекта
ERR_NO_OBJECT_NAME4204Нет имени объекта
ERR_OBJECT_COORDINATES_ERROR4205Ошибка координат объекта
ERR_NO_SPECIFIED_SUBWINDOW4206Не найдено указанное подокно
ERR_SOME_OBJECT_ERROR4207Ошибка при работе с объектом

Читайте также:  Восстановление код ошибки 0xc0000225 windows 10

Недопустимая операция, нарушающая функционирование сервера

Попытка открыть противоположный ордер в случае, если хеджирование запрещено

Попытка закрыть позицию по инструменту в противоречии с правилом FIFO

Критическая ошибка вызова DLL-функции

Слишком много параметров форматирования строки

Число параметров превышает число параметров форматирования строки

График не отвечает

Ошибка обработки глобальных переменных

Ресурс не найден

Ресурс не поддерживается

Ошибка инициализации пользовательского индикатора

Ошибка загрузки пользовательского индикатора

Нет исторических данных

Не хватает памяти для исторических данных

Не хватает памяти для расчёта индикатора

Торговля не разрешена. Необходимо включить опцию “Разрешить советнику торговать” в свойствах эксперта

Ордера на покупку не разрешены. Необходимо проверить свойства эксперта

Ордера на продажу не разрешены. Необходимо проверить свойства эксперта

Автоматическая торговля с помощью экспертов/скриптов запрещена на стороне сервера

Неизвестное свойство графика

График не найден

Не найдено подокно графика

Индикатор не найден

Ошибка выбора инструмента

Ошибка отправки push-уведомления

Ошибка параметров push-уведомления

Слишком частые запросы отсылки push-уведомлений

Не указан FTP сервер

Ошибка при подключении к FTP серверу

Подключение к FTP серверу закрыто

На FTP сервере не найдена директория для выгрузки файла

Не найден файл в директории MQL4Files для отправки на FTP сервер

Ошибка при передаче файла на FTP сервер

Неверное имя файла

Слишком длинное имя файла

Ошибка открытия файла

Ошибка размещения буфера текстового файла

Ошибка удаления файла

Неверный хендл файла (файл закрыт или не был открыт)

Неверный хендл файла (индекс хендла отсутствует в таблице)

Файл должен быть открыт с флагом FILE_WRITE

Файл должен быть открыт с флагом FILE_READ

Файл должен быть открыт с флагом FILE_BIN

Файл должен быть открыт с флагом FILE_TXT

Файл должен быть открыт с флагом FILE_TXT или FILE_CSV

Файл должен быть открыт с флагом FILE_CSV

Ошибка чтения файла

Ошибка записи файла

Размер строки должен быть указан для двоичных файлов

Неверный тип файла (для строковых массивов-TXT, для всех других-BIN)

Файл является директорией

Файл не существует

Файл не может быть перезаписан

Неверное имя директории

Директория не существует

Указанный файл не является директорией

Ошибка удаления директории

Ошибка очистки директории

Ошибка изменения размера массива

Ошибка изменения размера строки

Структура содержит строки или динамические массивы

URL не прошел проверку

Не удалось подключиться к указанному URL

Превышен таймаут получения данных

С этого кода начинаются ошибки, задаваемые пользователем

Каждый поток будет иметь свой последний код ошибки. Windows API установит последний код ошибки в вызывающем потоке.

Вы всегда должны вызывать GetLastError сразу после проверки возвращаемого значения функции API Windows.

Большинство функций Windows API устанавливают последний код ошибки, когда они терпят неудачу. Некоторые также установят последний код ошибки, когда они преуспеют. Существует ряд функций, которые не устанавливают последний код ошибки. Всегда обращайтесь к документации по функциям Windows API.

Невозможно использовать FORMAT_MESSAGE_FROM_SYSTEM без FORMAT_MESSAGE_IGNORE_INSERTS при использовании функции FormatMessage для получения описания кода ошибки.

Сообщается об ошибке с сообщением об ошибке

В дополнение к возвращаемому значению отказа / успеха некоторые вызовы API также устанавливают последнюю ошибку при сбое (например, CreateWindow ). Документация обычно содержит следующую стандартную формулировку для этого случая:

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

Очень важно, что вы вызываете GetLastError() НЕМЕДЛЕННО. Последний код ошибки может быть перезаписан любой другой функцией, поэтому, если есть дополнительная функция вызова между неудавшейся функцией и вызовом GetLastError() , возврат из GetLastError() больше не будет надежным. Будьте особенно осторожны при работе с конструкторами C ++.

Читайте также:  Коды ошибок лексус рх300 с расшифровками

net вы не должны P / Invoke в GetLastError() напрямую. Это связано с тем, что среда выполнения. net сделает другие вызовы Windows API одним и тем же потоком за вашей спиной. Например, сборщик мусора может вызвать VirtualFree() если он найдет достаточно памяти, которую он больше не использует, и это может произойти между вашим назначенным вызовом функции и вашим вызовом GetLastError().

Вместо этого. net предоставляет Marshal. GetLastWin32Error() , которая будет извлекать последнюю ошибку из последнего вызова P / Invoke, который вы сами сделали. Используйте это вместо прямого вызова GetLastError().

net, похоже, не мешает вам импортировать GetLastError() любом случае, я не уверен, почему

Идти

Различные средства, предоставляемые Go для вызова DLL-функций (которые находятся как в syscall пакета, syscall и в пакете golang. org/x/sys/windows ), возвращают три значения: r1 , r2 и err. r2 никогда не используется; вы можете использовать пустой идентификатор. r1 – возвращаемое значение функции. err является результатом вызова GetLastError() но преобразуется в тип, реализующий error , поэтому вы можете передать его вызывающим функциям для обработки.

Поскольку Go не знает, когда вызывать GetLastError() а когда нет, он всегда будет возвращать ошибку nil. Поэтому типичная идиома обработки ошибок Go

не будет работать. Вместо этого вы должны проверить r1 точно так же, как и на C, и использовать только err если это указывает, что функция возвратила ошибку:

Сообщается об ошибке с дополнительной информацией о сбоях и успехах

Некоторые вызовы API могут преуспеть или сбой более чем одним способом. API обычно возвращают дополнительную информацию как для успешных вызовов, так и для ошибок (например, CreateMutex ).

Преобразование кода ошибки в строку сообщения

GetLastError возвращает числовой код ошибки. Чтобы получить описательное сообщение об ошибке ( например , для отображения пользователю), вы можете вызвать FormatMessage :

В C ++ вы можете значительно упростить интерфейс, используя класс std::string :

ПРИМЕЧАНИЕ. Эти функции также работают для значений HRESULT. Просто измените первый параметр из DWORD dwErrorCode на HRESULT hResult. Остальная часть кода может оставаться неизменной.

Коды возврата торгового сервера

GetLastError() – функция, возвращающая коды ошибок. Кодовые константы ошибок определены в файле stderror. mqh. Для вывода текстовых сообщений следует использовать функцию ErrorDescription(), определенную в файле stdlib. mqh.

0
ERR_NO_ERROR
Нет ошибки

1
ERR_NO_RESULT
Нет ошибки, но результат неизвестен

2
ERR_COMMON_ERROR
Общая ошибка

3
ERR_INVALID_TRADE_PARAMETERS
Неправильные параметры

4
ERR_SERVER_BUSY
Торговый сервер занят

5
ERR_OLD_VERSION
Старая версия клиентского терминала

6
ERR_NO_CONNECTION
Нет связи с торговым сервером

7
ERR_NOT_ENOUGH_RIGHTS
Недостаточно прав

8
ERR_TOO_FREQUENT_REQUESTS
Слишком частые запросы

9
ERR_MALFUNCTIONAL_TRADE
Недопустимая операция, нарушающая функционирование сервера

64
ERR_ACCOUNT_DISABLED
Счет заблокирован

65
ERR_INVALID_ACCOUNT
Неправильный номер счета

128
ERR_TRADE_TIMEOUT
Истек срок ожидания совершения сделки

129
ERR_INVALID_PRICE
Неправильная цена

130
ERR_INVALID_STOPS
Неправильные стопы

131
ERR_INVALID_TRADE_VOLUME
Неправильный объем

132
ERR_MARKET_CLOSED
Рынок закрыт

133
ERR_TRADE_DISABLED
Торговля запрещена

134
ERR_NOT_ENOUGH_MONEY
Недостаточно денег для совершения операции

135
ERR_PRICE_CHANGED
Цена изменилась

136
ERR_OFF_QUOTES
Нет цен

137
ERR_BROKER_BUSY
Брокер занят

138
ERR_REQUOTE
Новые цены

139
ERR_ORDER_LOCKED
Ордер заблокирован и уже обрабатывается

140
ERR_LONG_POSITIONS_ONLY_ALLOWED
Разрешена только покупка

141
ERR_TOO_MANY_REQUESTS
Слишком много запросов

145
ERR_TRADE_MODIFY_DENIED
Модификация запрещена, так как ордер слишком близок к рынку

146
ERR_TRADE_CONTEXT_BUSY
Подсистема торговли занята

147
ERR_TRADE_EXPIRATION_DENIED
Использование даты истечения ордера запрещено брокером

148
ERR_TRADE_TOO_MANY_ORDERS
Количество открытых и отложенных ордеров достигло предела, установленного брокером

149
ERR_TRADE_HEDGE_PROHIBITED
Попытка открыть противоположный ордер в случае, если хеджирование запрещено

150
ERR_TRADE_PROHIBITED_BY_FIFO
Попытка закрыть позицию по инструменту в противоречии с правилом FIFO

  • Коды возврата торгового сервера
  • Предупреждения компилятора
  • Ошибки компиляции
  • Ошибки времени выполнения

Ошибка, сообщенная как значение HRESULT

HRESULT s – числовые 32-битные значения, где биты или диапазоны бит кодируют четко определенную информацию. MSB – это флаг отказа / успеха, а остальные бит хранят дополнительную информацию. Отказ или успех можно определить с помощью макросов FAILED или SUCCEEDED. HRESULT s обычно используются совместно с COM, но также отображаются в реализациях, отличных от COM (например, StringCchPrintf ).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *