Zhunko Опубликовано 11 мая, 2010 Жалоба Поделиться Опубликовано 11 мая, 2010 Консольное приложение RangSymbols.exe переписывает файл "symbols.sel", находящийся в папке с историей.Чтобы всё сработало надо:1. Достать из архива файл "RangSymbols.exe".2. Положить файл "RangSymbols.exe" в папку с историей: ...\MetaTrader 4.00\history\NameServer3. Выгрузить МТ4.4. Запустить приложение "RangSymbols.exe".5. Запустить МТ4. //+--------------------------------------------------------------------------------------+ //| RangSymbols.cpp: определяет точку входа для консольного приложения. | //| Приложение предназначено для сортировки по алфавиту символов в файле "symbols.sel" | //|терминала МТ4. Таким образом символы выстраиваются по алфавиту в окне "Обзор рынка". | //| Copyright © 2009, Жунко Вадим (Zhunko) | //| e-mail: vadim@zhunko.ru 09.03.2010 - 10.03.2010 | //+--------------------------------------------------------------------------------------+ #include "stdafx.h" // Пространства имён. using namespace std; // Функция возвращает описание кода системной ошибки. string StringError(const DWORD dwErrCode); // Код системной ошибки. //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж // Точка входа для консольного приложения. void main(int argc, char *argv[], char *envp[]) {// Константы. const bool DEBUGGING = false; // Включение отладки. // Переменные. DWORD dwByte = 0; // Количество прочитанных байт. HANDLE hHandle = 0; // Файловый описатель. int i, j, k; // Переменные для счётчиков и циклов. int erError = 0; // Номер последней ошибки. int nMaxSymbols = 0; // Максимальное количество инструментов обзора рынка МТ4. int nSearched = 0; // Номер найденного символа. int nSizeSymb = 0; // Размер файла с инструметами обзора рынка МТ4. string sExclusion = ""; // Возврат строки с сообщением об ошибке. string sInfoTool = ""; // Строка для инициализации массива. stringstream ssExclusion; // Строка с сообщением об ошибке. // Структуры. struct InfoTools_ {char szTool[12]; char szInfo[116];} InfoTool; // Массивы. vector <InfoTools_> vitSymbolsListNew; // Массив с сортированным списком. vector <InfoTools_> vitSymbolsListOld; // Массив с несортированным списком. //xxxx Общие операци. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx if (DEBUGGING) cout << "==== START ====================================== RangSymbols ====================================== START ====" << endl; SetConsoleOutputCP(1251); // Меняем кодовую странуцу. Работает только со шрифтом "Lucida Console" в CMD. memset(InfoTool.szTool, '\0', 12); // Очищаем массив структуры. memset(InfoTool.szInfo, '\0', 116); // Очищаем массив структуры. // Читаем файл со всеми инструментами МТ4. if (DEBUGGING) cout << "Читаем файл \"symbols.sel\" с инструментами обзора рынка МТ4." << endl; SetLastError(0); // Сбрасываем ошибки. //xxxx Блок перехвата ошибок. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx try {//==== Общие операции. ================================================================================================================================================================================================== sInfoTool.assign(128, '\0'); // Инициализируем строку в 128 знаков. if ((hHandle = CreateFileA("symbols.sel", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) { erError = GetLastError(); ssExclusion << endl << "Ошибка в приложении \"RangSymbols\"." << endl << "Не открыт файл \"symbols.sel\"" << endl << "Последняя ошибка: " << erError << endl << StringError(erError); cout << ssExclusion.str(); throw(ssExclusion.str()); } // Если файл открыт, сдвигаем файловый указатель в конец файла. Измеряем размер файла. if ((nSizeSymb = SetFilePointer(hHandle, 0, NULL, FILE_END)) < 0) { erError = GetLastError(); ssExclusion << endl << "Ошибка в приложении \"RangSymbols\"." << endl << "Не смещён файловый указатель в конец файла \"symbols.sel\"" << endl << "Последняя ошибка: " << erError << endl << StringError(erError); cout << ssExclusion.str(); throw(ssExclusion.str()); } else if (DEBUGGING) cout << "Размер файла \"symbols.sel\": " << nSizeSymb << " байт." << endl; // Сдвигаем файловый указатель в начало списка инструментов. if (SetFilePointer(hHandle, 4, NULL, FILE_BEGIN) != 4) { erError = GetLastError(); ssExclusion << endl << "Ошибка в приложении \"RangSymbols\"." << endl << "Не смещён файловый указатель на первый инструмент файла \"symbols.sel\"" << endl << "Последняя ошибка: " << erError << endl << StringError(erError); cout << ssExclusion.str(); throw(ssExclusion.str()); } nMaxSymbols = (nSizeSymb - 4) / 128; // Определяем количество инструментов, зарегистрированных в файле. if (DEBUGGING) cout << "В файле \"symbols.sel\" зарегистрировано " << nMaxSymbols << " инструментов." << endl; // Изменяем размер массива с сортированными и несортированными символами. vitSymbolsListOld.resize(nMaxSymbols); vitSymbolsListNew.resize(nMaxSymbols); // Считываем символы из файла. if (DEBUGGING) cout << "+----------------+" << endl << "| ИНСТРУМЕНТЫ |" << endl << "+---+------------+" << endl << "| № | TOOLS |" << endl << "+---+------------+" << endl; for (i = 0; i < nMaxSymbols; i++) {// Читаем название инструмента. if (!ReadFile(hHandle, &vitSymbolsListOld[i], 128, &dwByte, NULL) || dwByte != 128) { erError = GetLastError(); ssExclusion << endl << "Ошибка в приложении \"RangSymbols\"." << endl << "Не прочитано имя инструмента из файла \"symbols.sel\"" << endl << "Последняя ошибка: " << erError << endl << StringError(erError); cout << ssExclusion.str(); throw(ssExclusion.str()); } if (DEBUGGING) cout << "|" << setw(3) << i << "|" << setw(12) << vitSymbolsListOld[i].szTool << "|" << endl; } if (DEBUGGING) cout << "+---+------------+" << endl << endl; // Сортировка символов. for (i = 0; i < nMaxSymbols; i++) { if (DEBUGGING) cout << "+---------------------------------------------+" << endl << "| СОРТИРОВКА ИНСТРУМЕНТОВ |" << endl << "+---+------------+---+---+------------+---+---+" << endl << "| № | NEW |smb| № | OLD |smb|Ltr|" << endl << "+---+------------+---+---+------------+---+---+" << endl; // Ищем непустой инструмент для начала поиска. vitSymbolsListNew[i] = vitSymbolsListOld[0]; for (j = 0, k = 0, nSearched = 0; j < (nMaxSymbols - i); j++) {// Если символ имеет больший номер. if (DEBUGGING) cout << "|" << setw(3) << i << "|" << setw(12) << vitSymbolsListNew[i].szTool << "|" << setw(3) << vitSymbolsListNew[i].szTool[k] << "|" << setw(3) << j << "|" << setw(12) << vitSymbolsListOld[j].szTool << "|" << setw(3) << vitSymbolsListOld[j].szTool[k] << "|" << setw(3) << k << "|" << endl; if (!strcmp(vitSymbolsListNew[i].szTool, vitSymbolsListOld[j].szTool)) { k = 0; // Сбрасываем счётчик. continue; // Пропускаем итерацию, если одинаковые инструменты. } if (vitSymbolsListNew[i].szTool[k] > vitSymbolsListOld[j].szTool[k]) { vitSymbolsListNew[i] = vitSymbolsListOld[j]; // Берём наименьший символ. nSearched = j; // Номер найденного инструмента. } // Если символы одинаковые, переходим к анализу следующего символа в слове. if (vitSymbolsListNew[i].szTool[k] == vitSymbolsListOld[j].szTool[k]) { k++; // Увеличиваем счётчик букв в слове. j--; // Уменьшаем счётчик инструментов, чтобы вернуться к предыдущему. } else k = 0; // Обнуляем счётчик букв в слове,если серия одинаковых символов прошла. } vitSymbolsListOld.erase(vitSymbolsListOld.begin() + nSearched); // Удаляем ячейку с найденным инструментом. }/**/ if (DEBUGGING) cout << "+---+------------+---+---+------------+---+---+" << endl << endl; // Сдвигаем файловый указатель в начало списка инструментов. if (SetFilePointer(hHandle, 4, NULL, FILE_BEGIN) != 4) { erError = GetLastError(); ssExclusion << endl << "Ошибка в приложении \"RangSymbols\"." << endl << "Не смещён файловый указатель на первый инструмент файла \"symbols.sel\"" << endl << "Последняя ошибка: " << erError << endl << StringError(erError); cout << ssExclusion.str(); throw(ssExclusion.str()); } // Записываем новый список в файл. if (!WriteFile(hHandle, &vitSymbolsListNew[0], 128 * nMaxSymbols, &dwByte, NULL) || dwByte != DWORD(128 * nMaxSymbols)) { erError = GetLastError(); ssExclusion << endl << "Ошибка в приложении \"RangSymbols\"." << endl << "Файл \"symbols.sel\" не записан." << endl << "Последняя ошибка: " << erError << endl << StringError(erError) << endl; cout << ssExclusion.str(); throw(ssExclusion.str()); } else if (DEBUGGING) cout << "Файл \"symbols.sel\" записан с размером " << dwByte << " байт." << endl; // Закрываем файл. if (!CloseHandle(hHandle)) { erError = GetLastError(); ssExclusion << endl << "Ошибка в приложении \"RangSymbols\"." << endl << "Не закрыт файл \"symbols.sel\"" << endl << "Последняя ошибка: " << erError << endl << StringError(erError); cout << ssExclusion.str(); throw(ssExclusion.str()); } } //xxxx Контроль ошибок. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx catch(string sExclusion) { MessageBoxA(NULL, sExclusion.c_str(), "RangSymbols", MB_OK|MB_ICONSTOP|MB_DEFBUTTON1|MB_TASKMODAL); if (DEBUGGING) cout << "==== END ======================================== RangSymbols ======================================== END ====" << endl; #ifdef _DEBUG // В режиме отладки останавливаем выполнение программы для контроля ошибок. _getch(); #endif return; } catch(...) { MessageBoxA(NULL, "Неизвестная ошибка.", "RangSymbols", MB_OK|MB_ICONSTOP|MB_DEFBUTTON1|MB_TASKMODAL); if (DEBUGGING) cout << "==== END ======================================== RangSymbols ======================================== END ====" << endl; #ifdef _DEBUG // В режиме отладки останавливаем выполнение программы для контроля ошибок. _getch(); #endif return; } if (DEBUGGING) cout << "==== END ======================================== RangSymbols ======================================== END ====" << endl; #ifdef _DEBUG // В режиме отладки останавливаем выполнение программы для контроля ошибок. _getch(); #endif //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx } //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж // Функция возвращает описание кода системной ошибки. string StringError(const DWORD dwErrCode) // Код системной ошибки. { char szBuffer[MAX_PATH] = {'\0'}; // Буфер для приёма строки с описанием ошибки. FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, 0, dwErrCode, 0, szBuffer, MAX_PATH, 0); return(szBuffer); } //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж Приложение: RangSymbols.exe.rarПроект: RangSymbols.rar Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения