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

Если при работе вашей программы требуется вывод лога неопределенной длины, то это удобно делать в многострочном поле Edit. Преимущества такого способа налицо: можно мышкой выделить и скопировать любой кусок текста, средствами API получить весь текст целиком и сохранить в файл, быстро очистить окно лога и многое другое. Удобно делать все, кроме главного: добавление новых строчек в лог. Конечно, можно получать текст, в памяти добавлять к нему новые строчки и вставлять обратно. Но это долго, неудобно и требует дополнительных ресурсов, а для очень больших логов и вовсе неприемлемо. Поэтому воспользуемся следующей функцией:
;---------------------------------------------
; 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

Парметры вызова: hWnd - хэндл окна, которому принадлежит дочернее окно логом, CtrlID - идентификатор окна Edit в ресурсах, pStr - указатель на строку ASCIIZ, которую надо записать в лог.

Пример использования:
; Идентификатор окна лога в ресурсах
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
...

Окно лога желательно делать недоступным для редактирования (со стилем ES_READONLY). Строчки для добавления в лог обязательно должны заканчиваться символами перевода строки CRLF и нулем.
Теги:
логи
Добавлено: 10 Апреля 2018 20:43:38 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...