Вывод лога на Ассемблере
Если при работе вашей программы требуется вывод лога неопределенной длины, то это удобно делать в многострочном поле Edit. Преимущества такого способа налицо: можно мышкой выделить и скопировать любой кусок текста, средствами API получить весь текст целиком и сохранить в файл, быстро очистить окно лога и многое другое. Удобно делать все, кроме главного: добавление новых строчек в лог. Конечно, можно получать текст, в памяти добавлять к нему новые строчки и вставлять обратно. Но это долго, неудобно и требует дополнительных ресурсов, а для очень больших логов и вовсе неприемлемо. Поэтому воспользуемся следующей функцией:Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------
- ; procedure AddLog
- ; void AddLog(hWnd:dword,CtrlID:dword,pStr:&string)
- ;---------------------------------------------
- proc AddLog hWnd:dword,CtrlID:dword,pStr:dword
- push eax
- invoke GetDlgItem,[hWnd],[CtrlID]
- or eax,eax
- jz .AddLog_1
- mov [CtrlID],eax
- invoke SendMessage,[CtrlID],EM_GETLINECOUNT,0,0
- dec eax
- invoke SendMessage,[CtrlID],EM_LINEINDEX,eax,0
- invoke SendMessage,[CtrlID],EM_SETSEL,eax,eax
- invoke SendMessage,[CtrlID],EM_REPLACESEL,FALSE,[pStr]
- .AddLog_1:
- pop eax
- ret
- endp
Пример использования:
Code (Assembler) : Убрать нумерацию
- ; Идентификатор окна лога в ресурсах
- ID_LOG = 100
- ; Сегмент данных
- section '.data' data readable writeable
- ...
- ; Строчки для добавления в лог
- line1 db 'Some action 1',13,10,0
- line2 db 'Some action 2',13,10,0
- line3 db 'Some action 3',13,10,0
- ; Сегмент кода
- section '.code' code readable executable
- ...
- ; Средствами API записать первую строчку в лог
- invoke SetDlgItemText,[hwnddlg],ID_LOG,line1
- ; Дописать к ней две других строки
- stdcall AddLog,[hwnddlg],ID_LOG,line2
- stdcall AddLog,[hwnddlg],ID_LOG,line3
- ...
- ; Ресурсы
- section '.rsrc' resource data readable
- ...
- dialogitem 'EDIT','', ID_LOG, 10,10,100,200, WS_VISIBLE + ES_AUTOVSCROLL +\
- ES_MULTILINE + WS_BORDER + ES_READONLY
- ...
Просмотров: 5942 | Комментариев: 5
Метки: Assembler, полезные функции
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
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):
Спасибо! Отличное решение. Как раз случайно набрел и увидел пример...
пользуюсь везде теперь.
пользуюсь везде теперь.
Добавить комментарий
Заполните форму для добавления комментария
оказывается стандартный лимит в 64 кб