Сейчас на форуме: tyns777 (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Вывести текст из памяти в EDIT CONTROL
Посл.ответ Сообщение

Ранг: 16.3 (новичок), 2thx
Активность: 0.150.22
Статус: Участник

Создано: 18 августа 2019 21:08
· Личное сообщение · #1

Привет может здесь сможет мне кто то помочь. Столкнулся с такой странной проблемой. Пишу проект на MFC. Мне нужно что бы при открытии любого файла определенные его участки можно было просмотреть в текстовом формате. Поместил на диалоговое окно EDIT CONTROL. Попробовал данный код
Code:
  1.          HANDLE FileR;
  2.          FileR = CreateFile("D:\Test.exe", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  3.          DWORD  dwRead;
  4.          DWORD size;
  5.          size = GetFileSize(FileR, NULL);
  6.          LPTSTR pBufferExe = (LPTSTR)malloc(size);
  7.          ReadFile(FileR, pBufferExe, size, &dwRead, NULL);
  8.          GetDlgItem(IDC_CONTROL)->SetWindowText(pBufferExe);

С текстовыми файлами все в порядке,но вот с любыми исполняемыми файлами странный глюк. Текст выводится только одной маленькой начальной строчкой, остальное игнорируется. Если начать считывать файл с произвольного места, то опять короткая строчка и все. Как я понял в основном затыкается на пробелах строк. Как такое происходит?
Я уже голову сломал над этим!




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 18 августа 2019 21:11
· Личное сообщение · #2

Вероятно выводится до первого нуля-терминатора, editbox это про строки, они нулем заканчиваются.

-----
2 оттенка серого




Ранг: 16.3 (новичок), 2thx
Активность: 0.150.22
Статус: Участник

Создано: 18 августа 2019 21:29
· Личное сообщение · #3

f13nd пишет:
Вероятно выводится до первого нуля-терминатора, editbox это про строки, они нулем заканчиваются.
D В текстовых файлах такого нет. Там по идее те же строки.Я вам больше скажу, если открыть файл в блокноте а потом сохранить его выбрав ту же кодировку, то все работает все прекрасно читается. Правда сам файл становится не рабочим. Что блокнот то делает такое?




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 18 августа 2019 21:37
· Личное сообщение · #4

zombi-vadim пишет:
Что блокнот то делает такое?

Заменяет все нули на пробелы
Code:
  1. 00000000h 4D 5A 80 00 01 00 00 00 04 00 10 00 FF FF 00 00  MZ.............. 
  2. 00000010h 40 01 00 00 00 00 00 00 40 00 00 00 00 00 00 00  @.......@....... 
  3. 00000020h 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 
  4. 00000030h 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00  ................ 
  5.  
  6. 00000000h 4D 5A 80 20 01 20 20 20 04 20 10 20 FF FF 20 20  MZ. .   . . ..   
  7. 00000010h 40 01 20 20 20 20 20 20 40 20 20 20 20 20 20 20  @.      @        
  8. 00000020h 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                   
  9. 00000030h 20 20 20 20 20 20 20 20 20 20 20 20 80 20 20 20              .


-----
2 оттенка серого




Ранг: 173.8 (ветеран), 208thx
Активность: 0.120.36
Статус: Участник

Создано: 18 августа 2019 21:40 · Поправил: VOLKOFF
· Личное сообщение · #5

zombi-vadim пишет:
В текстовых файлах такого нет

Потому что нулей и "невалидных" управляющих символов нет
Думаете почему бинарные файлы просматриваются в hex эдиторах, а не текстовых редакторах?



Ранг: 16.3 (новичок), 2thx
Активность: 0.150.22
Статус: Участник

Создано: 18 августа 2019 21:43
· Личное сообщение · #6

f13nd пишет:
Заменяет все нули на пробелы
Упс...А я как то даже не задумывался над этим.

Добавлено спустя 4 минуты
Получается следующее, в буфере лежит правильный бинарный файл заданной длинны. А вот edit control при приеме видит ноль, считает что это конец текста и обрывает его?




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 18 августа 2019 21:51
· Личное сообщение · #7

zombi-vadim пишет:
А вот edit control при приеме видит ноль, считает что это конец текста и обрывает его?

Все текстовые функции, использующиеся в этом контроле, не видят дальше нуля. По-моему только в творениях борланда строки не так кодируются, но это совсем другая история.

VOLKOFF пишет:
бинарные файлы просматриваются в hex эдиторах, а не текстовых редакторах?

Годней всего смотреть бинарные файлы в паинте, надо только bmp-заголовок для них правильный сформировать и смотреть снизу вверх.

-----
2 оттенка серого




Ранг: 16.3 (новичок), 2thx
Активность: 0.150.22
Статус: Участник

Создано: 18 августа 2019 21:54
· Личное сообщение · #8

VOLKOFF пишет:
Годней всего смотреть бинарные файлы в паинте

Так мне то как поступить?Все конец проекта




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 18 августа 2019 22:03
· Личное сообщение · #9

zombi-vadim пишет:
Так мне то как поступить?Все конец проекта

Если у тебя появилась нужда выводить ехе файлы в эдитбокс, значит в одном из предыдущих этапов выбрал не то направление развития проекта.

-----
2 оттенка серого


| Сообщение посчитали полезным: zombi-vadim

Ранг: 16.3 (новичок), 2thx
Активность: 0.150.22
Статус: Участник

Создано: 18 августа 2019 22:09
· Личное сообщение · #10

Спасибо вам за разъяснение, а то на другом форуме меня послали менять кодировки, я кучу времени потратил пока понял что это не то. Все же если у кого есть какие то идеи как мне поступить буду рад их прочитать.

Добавлено спустя 15 минут
f13ndЯ вот посмотрел в hex эдиторе файл. Он же как то интерпретирует строчки, во втором поле он выводит текстовую символьную информацию, заменяя определенные значения точками. Как он различает где символ а где ноль? там есть такие варианты как 01 или 10 или 0е.Там точки стоят а вот например 40 там символ?




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 18 августа 2019 22:30
· Личное сообщение · #11

Нех-редактор в текстовой части не выводит данные напрямую, а интерпретирует их, заменяя непечатные символы чем-нибудь. Там обычно не editbox, а самопальный контрол на listview или полностью самопальный. Можно наверное засабклассить и эдитбокс фильтруя налету и таки выводить в него, но по-моему сама затея очень странная.

-----
2 оттенка серого




Ранг: 16.3 (новичок), 2thx
Активность: 0.150.22
Статус: Участник

Создано: 18 августа 2019 22:36
· Личное сообщение · #12

f13nd пишет:
заменяя непечатные символы чем-нибудь
Тоесть он как то фильтрует символы на печатные и нет. Интересно как он их различает, при наличии кучи кодировок. Блокнот например видит отдельные символы и считает их печатными только выводит крокозяблы.




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 18 августа 2019 22:39
· Личное сообщение · #13

https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-settext
Примерно к этому сводится вывод строки в едит, один аргумент - null-terminated string, длину строки никуда не сунешь. Можешь добавить свой обработчик сообщения, который выделит новый буфер, скопирует в него и заменит там, либо сразу в буфере заменит и WM_SETTEXT передаст контролу. Но это как бы нормально сработает в режиме только чтения, если продолжать безумствовать в сторону редактирования ехе файла в блокноте, придется усложнять.

Добавлено спустя 1 минуту
zombi-vadim пишет:
Блокнот например видит отдельные символы и считает их печатными только выводит крокозяблы.

Блокноту пофигу, он просто заменяет нули в буфере на входе и отдает едиту как бааальшущую строку.

-----
2 оттенка серого


| Сообщение посчитали полезным: zombi-vadim

Ранг: 16.3 (новичок), 2thx
Активность: 0.150.22
Статус: Участник

Создано: 18 августа 2019 22:56
· Личное сообщение · #14

f13nd пишет:
продолжать безумствовать в сторону редактирования ехе файла в блокноте
Да задачи такой не стоялоХотелось бы просто нормально вывести файл как в блокноте. Спасибо вам еще раз!




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 20 августа 2019 09:40
· Личное сообщение · #15

zombi-vadim
Если ты хочешь сделать вывод содержимого файла в читабельном виде, а не для редактирования, то используй вывод hex-последовательности.

Самый примитивный способ: выводить через sprintf.

1. Сначала выводишь заголовок: " 0 1 2 3 4 5 6 7 8 9 A B C D E F"
2. Потом с помощью sprintf выводишь последовательно байты в hex блоками по 16 байт.

Шрифт используй моноширинный, чтобы все символы были выровнены.

Читай:
- Шестнадцатеричная система счисления
- Синтаксис описания формата: функции printf и wprintf

-----
EnJoy!



 eXeL@B —› Вопросы новичков —› Вывести текст из памяти в EDIT CONTROL
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати