Если при работе вашей программы требуется вывод лога неопределенной длины, то это удобно делать в многострочном поле 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 и нулем.