Известен код ошибки выполнения API функции, как определить какая ошибка скрывается за этим шестнадцатиричным кодом? Обычно код ошибки возаращается в регистре EAX. Аналогично и с параметрами для функций. Например есть необходимость применить какой-то параметр, но неизвестен его код. Где можно узнать, или каким образом можно определить коды ошибок и параметров для незнакомых функций?
Код (Text): void GET_ERROR() { TCHAR szBuf[80]; LPVOID lpMsgBuf; DWORD ERROR_DW = GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, ERROR_DW, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); wsprintf(szBuf,"Ошибка %d: %s",ERROR_DW, lpMsgBuf); MessageBox(NULL, szBuf, 0, MB_OK); } после вызова апи
Вообще говоря, если после GET_ERROR() будет сразу ExitProcess, то на освобождение памяти можно забить. хотя это больше вопрос красоты =)
mobymax Коды параметров объявлены во включаемых файлах. На ассемблере - *.inc, например windows.inc. На С - windows.h и другие заголовочные файлы. В каком именно файле объявлены коды параметров каждой конкретной функции, написано в описании этой функции в MSDN. В MSDN значения кодов ошибок не встречал (хотя специально не искал - мне достаточно, как OllyDbg их показывает).
Код (Text): .386 .MODEL Flat, STDCALL ;--------------------------------------------------------------------- --- ; Functions ;--------------------------------------------------------------------- --- ;--------------------------------------------------------------------- --- ; libs ;--------------------------------------------------------------------- --- includelib c:\masm32\lib\kernel32.lib includelib c:\masm32\lib\user32.lib include c:\masm32\include\kernel32.inc include c:\masm32\include\user32.inc include c:\masm32\include\windows.inc ;--------------------------------------------------------------------- --- ; D A T A ;--------------------------------------------------------------------- --- .DATA? LASTERR DWORD ? lpBuffer DB 1024 DUP (?) lpSource DB 1024 DUP (?) .DATA FILENAME db "C:\text.txt",0 .CODE GETERROR PROC invoke GetLastError mov LASTERR,eax invoke FormatMessage,FORMAT_MESSAGE_FROM_SYSTEM,0,DWORD PTR DS:[LASTERR],0,addr lpBuffer,1024,0 push 0 push 0 push offset lpBuffer push 0 call MessageBox ret GETERROR endp start: invoke CreateFile,addr FILENAME,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0 call GETERROR invoke ExitProcess,0 end start
кто сказал что в MSDN нет кодов ошибок, там есть есть многое.... ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.WINCE.v50.en/wcecoreos5/html/wce50grferrorvalues.htm
Ничего такого я не говорил. Знаю, что в MSDN есть многое. Я всего лишь сказал, что не искал специально.
если рець идёт о win32 api, то как уже было показано, юзай FormatMessage но если для native-api нужно, то ф-ций позволяющих получить сообщение вроде нет (хотя возможно плохо искал) но зато ко всем кодам есть комментарии в ntstatus.h =)
Nouzui Ну, большинство кодов-то совпадает. А вышеупомянутая функция загоняет код возврата в LastError.
STATUS_WAIT_3 (0x03) - FormatMessage="The system cannot find the path specified. " STATUS_ABANDONED (0x080) - FormatMessage="There are no child processes to wait for. " STATUS_USER_APC (0x0C0) - FormatMessage="The operating system cannot run %1. " итд STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L) - ForrmatMessage возвращает ошибку STATUS_ACCESS_VIOLATION ((NTSTATUS)0xC0000005L) - то же самое..
Nouzui Да, не то сказал. Я думал, функция снимает верхние биты и сохраняет полученный код возврата; посмотрел реализацию — оказалось всё серьёзнее, там используются таблицы для преобразования.