Собственные методы класса
В начало файла LookDlg.cpp (после директивы #endif) введите определения глобальных данных, которые будут использованы как в методах класса, так и в глобальных функциях:
//=== Текущие значения кода, индекса и текста сообщения string gCode, gsID, gsMsg; //====== Количество категорий (групп) ошибок const int N_FACILITIES = 23; //====== Имена категорий ошибок TCHAR *gsFacilities[N_FACILITIES + 1] = { "NULL", "RFC", "Dispatch", "Storage", "Interface", "Unknown", "Unknown", "Win32", "Windows", "SSPI", "Control", "Cert", "Internet", "MediaServer", "MSMQ", "SetupAPI", "Smart Card", "COM+", "AAF", "URT", "ACS", "DPlay", "UMI", "SXS" };
Категории ошибок принято обозначать аббревиатурами, смысл которых можно выяснить в разделе Glossary MSDN. Например, аббревиатура RFC (Remote Procedure Call) обозначает категорию ошибок, связанных с обращением к процедурам, которые размещены на других процессорах сети.
Повторите последовательность действий по введению в класс вспомогательной функции и создайте функцию Getlnfo. Она выбирает из контейнера структуру, которая соответствует ошибке с индексом nPos, и присваивает переменным, связанным с элементами управления в окне диалога, значения, которые характеризуют ошибку (атрибуты ошибки). После такой операции можно проводить обмен данными (UpdateData(FALSE)) с дочерними окнами диалога и они "высветят" ошибку.
- Переведите фокус мыши на узел CLookDlg в дереве классов Class View, вызовите контекстное меню и дайте команду Add › Add Function.
- В окне мастера Add Member Function Wizard заполните следующие поля: Return type: void, Function name: Getlnfo, Parameter type: int, Parameter name: nPos.
- Нажмите кнопку Add.
- В поле Access: задайте тип доступа public:
void CLookDlg::GetInfo(int nPos) { // ======= Текущая позиция m_CurPos.Format("%d",nPos); if (nPos >= m_nltems) return; //======= Выбираем поля структуры m_Code = m_Vector[nPos].Code.c_str(); m_Msg = m_Vector[nPos].Message.c_str(); m_ID= m_Vector[nPos].Identifier.c_str(); //====== Преобразование кода в целое число DWORD dw = strtoul(LPCTSTR(m_Code),0.0); //====== Выделяем старший бит (Severity) m_Severity = dw & 0x80000000? "Fail": "Success"; //=== СОМ-коды это НЕХ-коды, длина которых > 8 символов //=== В этой ветви мы обрабатываем Win32-ошибки if (m_Code.GetLength() < 8) { if (dw) { //====== Вставляем поля facility и severity dw = 0x80000000 | (0x7 << 16) | (dw f, OxFFFF); m_Severity = "Error"; } } //====== Выделяем поле facility UINT f = (dw"16) & 0xlFFF; //====== Выбираем нужную аббревиатуру m_Facility = f <= N_FACILITIES | gsFacilities[f): "Unknown"; }
Так как коды \Ут32-ошибок не имеют полей facility и severity (эти атрибуты появились позже), то их надо синтезировать. Таким же образом поступает макроподстановка HRESULT_FROM_wiN32, и ее можно использовать в этом месте, но мы (с учебной целью) вставили ее код. Если вы хотите опробовать макрос, то замените строку:
dw = 0x80000000 | (0x7 << 16) | (dw & 0xFFFF);
На:
dw = HRESULT_FROM_WIN32(dw);
Далее мы выделяем поле facility и выбираем из массива gsFacilities аббревиатуру, которая более информативна, чем число f, кодирующее facility.