C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 34 - Как функции возвращают код ошибки / Отладка / Visual C++

Шаг 34 - Как функции возвращают код ошибки

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

VOID SetLastError
(
	DWORD dwErrCode   
);

Код ошибки это 32 битное число, в котором для нас главное это бит 29. Этот бит определяет пользовательский код или системный.

0 - Microsoft
1 - Пользовательский

Когда Вы определяете код, то этот бит нужно устанавливать в единицу. Биты от 0 до 15 можно определять самостоятельно, то есть получается что у нас есть возможность задать 32767 ошибок. 29 бит можно установить вот так.

#define MY_ERROR 0x20000000

Ну, а дальше можно добавлять кода ошибок. Попробуем создать свое сообщение на примере прошлого шага. Но нужно учесть, что в результате вызова FomatMessage может произойти ошибка. То есть сообщение может быть не найдено, в этом случае функция вернет 0.

#include "stdafx.h"
#include "windows.h"
#include "iostream.h"

#define MY_ERROR 0x20000000

void main()
{
	SetLastError(MY_ERROR);
	DWORD dwRez;
	LPVOID lpMsgBuf;
	dwRez=FormatMessage( 
		FORMAT_MESSAGE_ALLOCATE_BUFFER | 
		FORMAT_MESSAGE_FROM_SYSTEM | 
		FORMAT_MESSAGE_IGNORE_INSERTS,
		NULL, GetLastError(),  MAKELANGID(LANG_NEUTRAL, 
		SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL );
	if (dwRez!=0)
		cout << (char*)lpMsgBuf << endl;
	else
		cout << "Error Message" << endl;
}

Запустив этот код на выполнение, Вы увидите, что описание кода ошибки не найдено.

34_1.gif (2562 b)


| |
Автор Каев Артем.
[AD]