День добрый.
Стоит задача — написать hex differ на чистом winapi на C / C++ (т.е. графическое приложение наподобие опции "Сравнить по содержимому" в Total Commander'е для бинарных файлов). Один нюанс — программа должна работать с большими файлами (> 4 Гб). Выглядеть это должно примерно как во встроенной утилите Lister, встроенной в тот же Тотал (в режиме hex-отображения, конечно). Неважно какого объема файл открываешь — по вертикальному скроллу должна быть возможность попасть в любую часть файла.
Но пока более простая задача — сделать аналог Lister'а.
В качестве графического объекта был выбран RichEdit, т.к. нужно будет подсвечивать различия между файлами другим цветом.
Для подкачки кусков файла использую маппинг — функции CreateFileMapping / MapViewOfFile.
Проблема заключается в том, что я плохо представляю как реализовать незаметную подкачку другого куска (64 кб) и возможность по скроллу перейти в любое место файла.
Правильно ли я представляю, как это будет выглядеть:
1). При загрузке файла вычисляем его размер и выставляем диапазон у скролла RichEdit'а как размер файла / 8, т.к. по 8 байт будет в каждой строке.
2). Устанавливаем для RichEdit-объектов собственную процедуру обработки сообщений, где будем отслеживать скролл-сообщения и заменять подкачанный кусок по необходимости.
Есть сложности в определении этой необходимости. Например, если мы сейчас находимся по смещению FFFE, и спустимся ещё на пару байт вниз, то нужно подкачать следующий кусок файла, но при этом на экране должны остаться байты по смещениям FFF0, например с предыдущего куска.
Предполагаемое решение — памить кусками по 64 кб но по смещениям, не кратным 64 Кб.
Например: в анчале программы загружен кусок 0x0000 — 0xFFFF. Если мы переступаем смещение 0xF000, то грузим кусок 0xE000 — x1DFFF.
3). Маппим первые 64 кбайта файла и отображаем на RichEdit'е.
Второй вопрос — какие примерные действия над самим RichEdit'ом нужно совершать в обработчике скролл-сообщений? Я слабо представляю как связать скролл с диапазоном в весь файл и вывод куска в RichEdit, чтобы это правильно работало.