Blog. Just Blog

Вывод лога на Ассемблере

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Если при работе вашей программы требуется вывод лога неопределенной длины, то это удобно делать в многострочном поле Edit. Преимущества такого способа налицо: можно мышкой выделить и скопировать любой кусок текста, средствами API получить весь текст целиком и сохранить в файл, быстро очистить окно лога и многое другое. Удобно делать все, кроме главного: добавление новых строчек в лог. Конечно, можно получать текст, в памяти добавлять к нему новые строчки и вставлять обратно. Но это долго, неудобно и требует дополнительных ресурсов, а для очень больших логов и вовсе неприемлемо. Поэтому воспользуемся следующей функцией:
  1. ;---------------------------------------------
  2. ; procedure AddLog
  3. ; void AddLog(hWnd:dword,CtrlID:dword,pStr:&string)
  4. ;---------------------------------------------
  5. proc    AddLog  hWnd:dword,CtrlID:dword,pStr:dword
  6.         push    eax
  7.         invoke  GetDlgItem,[hWnd],[CtrlID]
  8.         or      eax,eax
  9.         jz      .AddLog_1
  10.         mov     [CtrlID],eax
  11.         invoke  SendMessage,[CtrlID],EM_GETLINECOUNT,0,0
  12.         dec     eax
  13.         invoke  SendMessage,[CtrlID],EM_LINEINDEX,eax,0
  14.         invoke  SendMessage,[CtrlID],EM_SETSEL,eax,eax
  15.         invoke  SendMessage,[CtrlID],EM_REPLACESEL,FALSE,[pStr]
  16. .AddLog_1:
  17.         pop     eax
  18.         ret
  19. endp  
Парметры вызова: hWnd - хэндл окна, которому принадлежит дочернее окно логом, CtrlID - идентификатор окна Edit в ресурсах, pStr - указатель на строку ASCIIZ, которую надо записать в лог.

Пример использования:
  1. ; Идентификатор окна лога в ресурсах
  2. ID_LOG  = 100  
  3.  
  4. ; Сегмент данных
  5. section '.data' data readable writeable
  6. ...
  7. ; Строчки для добавления в лог
  8. line1   db 'Some action 1',13,10,0
  9. line2   db 'Some action 2',13,10,0
  10. line3   db 'Some action 3',13,10,0
  11.  
  12. ; Сегмент кода
  13. section '.code' code readable executable
  14. ...
  15.         ; Средствами API записать первую строчку в лог
  16.         invoke  SetDlgItemText,[hwnddlg],ID_LOG,line1
  17.  
  18.         ; Дописать к ней две других строки
  19.         stdcall AddLog,[hwnddlg],ID_LOG,line2
  20.         stdcall AddLog,[hwnddlg],ID_LOG,line3
  21. ...
  22.  
  23. ; Ресурсы
  24. section '.rsrc' resource data readable
  25. ...
  26. dialogitem 'EDIT','', ID_LOG, 10,10,100,200, WS_VISIBLE + ES_AUTOVSCROLL +\   
  27.             ES_MULTILINE + WS_BORDER + ES_READONLY
  28. ...
Окно лога желательно делать недоступным для редактирования (со стилем ES_READONLY). Строчки для добавления в лог обязательно должны заканчиваться символами перевода строки CRLF и нулем.

Поделиться ссылкой ВКонтакте
Просмотров: 5857 | Комментариев: 5

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
darkz (29.01.2022 в 18:09):
ManHunter, thanks
оказывается стандартный лимит в 64 кб
ManHunter (28.01.2022 в 17:26):
Ну а чего нет-то? EM_SETLIMITTEXT и вперед, все прекрасно работает.
darkz (28.01.2022 в 17:10):
Работает отлично, но только если строк не более 1000 средней длины.
Можно как-то увеличить лимит строк ?
Владимир (11.01.2010 в 01:10):
Да, вспомнил молодость! Автор - молодец! Восхитительно то, что кроме знания ассемблера у автора есть увлечённость и умение описывать такие вещи.
Антоха (03.05.2009 в 19:12):
Спасибо! Отличное решение. Как раз случайно набрел и увидел пример...
пользуюсь везде теперь.

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.06 сек. / MySQL: 2 (0.0066 сек.) / Память: 4.5 Mb
Наверх