Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Описание ошибки по номеру

270
10 октября 2004 года
Drew
265 / / 20.07.2000
Есть INT ошибки от GetLastError нужно получить описание.
Кто помнит функцию, подскажите пожалуйста
243
10 октября 2004 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Drew
Есть INT ошибки от GetLastError нужно получить описание.
Кто помнит функцию, подскажите пожалуйста


Если не задумываясь, то вот - цитата из книги Джеффри Рихтера (правда прога для VC++ но с переводом в билдер думаю проблем не возникнет):
Собственно функция:

DWORD FormatMessage(
DWORD dwFlags,
LPCVOID pSource,
DWORD dwMessageId,
DWORD dwLanguageId,
PTSTR pszBuffer,
DWORD nSize,
va_list *Arguments);

И прога:
В поле Error можно ввести любой код ошибки. Когда Вы щелкнете кнопку Look Up, внизу, в прокручиваемом окне появится текст с описанием данной ошибки. Единственная интересная особенность программы заключается в том, как она обращается к функции FormatMessage. Я использую эту функцию так:

// получаем код ошибки
DWORD dwError = GetDlgItemInt(hwnd, IDC_ERRORCODE, NULL, FALSE);

HLOCAL hlocal = NULL; // буфер для строки с описанием ошибки

// получаем текстовое описание ошибки
BOOL fOk = FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL, dwError, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
(LPTSTR) &hlocal, 0, NULL);

if (hlocal != NULL) {
SetDlgItemText(hwnd, IDC_ERRORTEXT, (PCTSTR) LocalLock(hlocal));
LocalFree(hlocal);
} else {
SetDlgItemText(hwnd, IDC ERRORTEXT, TEXT("Error number not found."));
}




Первая строка считывает код ошибки из текстового поля. Далее я создаю экземпляр описателя (handle) блока памяти и инициализирую его значением NULL. Функция FormatMessage сама выделяет нужный блок памяти и возвращает нам его описатель.

Вызывая FormatMessage, я передаю флаг FORMAT_MESSAGE_FROM_SYSTEM. Он сообщает функции, что мне нужна строка, соответствующая коду ошибки, определенному в системе. Кроме того, я передаю флаг FORMAT_MESSAGE_ALLOCATE_BUFFER, чтобы функция выделила соответствующий блок памяти для хранения текста. Описатель этого блока будет возвращен в переменной hlocal. Третий параметр указывает код интересующей нас ошибки, а четвертый — язык, на котором мы хотим увидеть её описание.

Если выполнение FormatMessage заканчивается успешно, описание ошибки помещается в блок памяти, и я копирую его в прокручиваемое окно, расположенное в нижней части окна программы. А если вызов FormatMessage оказывается неудачным, я пытаюсь найти код сообщения в модуле NetMsg.dll, чтобы выяснить не связана ли ошибка с сетью. Используя описатель NetMsg.dll, я вновь вызываю FormatMessage. Дело в том, что у каждого DLL или EXE-модуля может быть собственный набор кодов ошибок, который включается в модуль с помощью Message Compiler (MC.exe). Как раз это и позволяет делать утилита Error Lookup через свое диалоговое окно Modules.

270
10 октября 2004 года
Drew
265 / / 20.07.2000
Цитата:
Originally posted by pacific_7

Если не задумываясь, то вот - цитата из книги Джеффри Рихтера (правда прога для VC++ но с переводом в билдер думаю проблем не возникнет):



А попроще-то никак? ... ну типа perror(...)

243
11 октября 2004 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Drew


А попроще-то никак? ... ну типа perror(...)


Конечно perror(...), если прога для консольки. А тебе для чего нужно, наверно для GUI?..

270
11 октября 2004 года
Drew
265 / / 20.07.2000
Цитата:
Originally posted by pacific_7

Конечно perror(...), если прога для консольки. А тебе для чего нужно, наверно для GUI?..



думается, что тут нет никакой половой разницы, потому что мне нужно получить текст объяснения ошибки (строку то бишь) а я уже как-нибудь сам её выведу, куда надо...

368
11 октября 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by Drew


думается, что тут нет никакой половой разницы, потому что мне нужно получить текст объяснения ошибки (строку то бишь) а я уже как-нибудь сам её выведу, куда надо...


 
Код:
LPVOID pv;
  DWORD dwRet = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
                  NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
                  (LPTSTR)&pv, 0, NULL);
  MessageBox(NULL, (LPTSTR)pv, _T("Error"), MB_ICONHAND);
  LocalFree(pv);
в pv находится описание ошибки, если dwRet != 0.
270
11 октября 2004 года
Drew
265 / / 20.07.2000
Цитата:
Originally posted by rostyslav

 
Код:
LPVOID pv;
  DWORD dwRet = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
                  NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
                  (LPTSTR)&pv, 0, NULL);
  MessageBox(NULL, (LPTSTR)pv, _T("Error"), MB_ICONHAND);
  LocalFree(pv);
в pv находится описание ошибки, если dwRet != 0.


а где можно найти список ошибок?
к примеру GetLastError возвращает 2, то что бы это значило?

368
11 октября 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by Drew

а где можно найти список ошибок?
к примеру GetLastError возвращает 2, то что бы это значило?



The system cannot find the file specified. ERROR_FILE_NOT_FOUND

В helpe Visual C++ есть описание. (т.е. MSDN)

Но и в Buildere тоже есть что то: меню Help->Windows SDK и ключевое слово Error Codes
ErrorCodes (Win32 Programmer's Reference)

270
11 октября 2004 года
Drew
265 / / 20.07.2000
Цитата:
Originally posted by rostyslav


The system cannot find the file specified. ERROR_FILE_NOT_FOUND

В helpe Visual C++ есть описание. (т.е. MSDN)

Но и в Buildere тоже есть что то: меню Help->Windows SDK и ключевое слово Error Codes



Блин! ... спасибо за наставление на путь истинный! :))) сам дятел - ЕСТЬ ЖЕ MSDN!!
Спасибо ещё раз. Один тупой семи мудрецам покоя не даёт :))

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог