|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 13, 2004 15:47:10 Есть ли полный аналог dbgprint для user mode outputdebugstring не позволяет использовать %d, %s и т.д. |
|
|
Дата: Авг 14, 2004 11:30:31 Сам понял что нет :( Сделал так:
#if DBG
#define DebugOut(_x_) DebugOut1(_x_);
#else
#define DebugOut(_x_)
#endif
#if DBG
void DebugOut1(const TCHAR* str, ...)
{
TCHAR buff[1024];
va_list parameters;
va_start(parameters, str);
wvsprintf(buff, str, parameters);
va_end(parameters);
OutputDebugString(buff);
}
#endif
Однако макрос DebugOut не корректен - передается только один параметр. Как передать все ? |
|
|
Дата: Авг 15, 2004 14:37:56 · Поправил: S_T_A_S_ А если так: #if DBG
void DebugOut(const TCHAR* str, ...)
{
TCHAR buff[1024];
va_list parameters;
va_start(parameters, str);
wvsprintf(buff, str, parameters);
va_end(parameters);
OutputDebugString(buff);
}
#else
#define DebugOut(_x_)
#endif
Вот ещё вариант на FASM'е. Вывод происходит в дополнительное окно EDIT (так как вывожу не только сообщения об ошибках, но и всякую дополнительную инфу), но можно легко адаптировать под любые нужды. Меняет только регистр eax и имеет весьма небольшой размер. Параметры передаются так: непосредственно после команды call распологается строка-формат заканчивающаяся нулём, остальные параметры передаются через стек, как для wprintf. Подпрограммка сама очищает стек и возвращает управление после строки. Есть так же макрос для упрощения работы и избавления от возможных ошибок (несоответствие количества параметров для wsprintf и символов "%") Пример использования: LogWindow.Write 'Log window created \nHandle=%08lXh',dword[ebp] Символы '\n' заменяются на символы перевода строки во время компиляции. Строка-формат должна быть не более 255 символов, длина не проверяется.
; можно без структуры обойтись,
; заменив _PUSHA.eax и sizeof._PUSHA соответствующими цифрами
struc _PUSHA
{
.edi dd ?
.esi dd ?
.ebp dd ?
.esp dd ?
.ebx dd ?
.edx dd ?
.ecx dd ?
.eax dd ?
}
virtual at 0
_PUSHA _PUSHA
sizeof._PUSHA = $
end virtual
;PROC Log.Write
label Log.Write
pusha
lea esi,[esp+sizeof._PUSHA]
lodsd [esi] ;; address after CALL
mov edx,esp
dec dh ;; 256 bytes buffer for wvsprintf
mov esp,edx
; push 0A0D0D0Dh ;; new line
push esi ;; esi = address of VA_LIST for wvsprintf
push eax ;; pFormat for wvsprintf
xchg eax,esi
push 1
pop edi ;; ardument counter
@@: lodsb [esi]
or al,al
jz .eof
cmp al,'%'
jnz @b
inc edi
jmp @b
.eof: stdcall [wvsprintf], edx
; этот код можно поменять на OutputDebugString
mov ebx,[SendMessage]
mov ebp,[Log.hCanvas] ; <<======= handle окна EDIT
stdcall ebx,ebp,EM_SETSEL,-1,-1
stdcall ebx,ebp,EM_REPLACESEL,0,esp ; esp = buffer
; pop ecx ;; remove 0A0D0D0Dh DWORD
xchg eax,esp
inc ah
xchg eax,esp
mov [esp+sizeof._PUSHA],esi ;; we'll return after the string
mov [esp+_PUSHA.eax],edi
popa
lea eax,[esp+eax*4]
xchg eax,esp
jmp dword[eax]
;ENDP
macro Log.Write form,[arg]
{
common local args,char,.text
args=0
reverse if~arg eq
Push arg
args=args+1
end if
common call Log.Write
.text db form,0
repeat $-.text-1
load char word from .text+%-1
if char='\n'
store word 0A0Dh at .text+%-1
end if
if char and 255='%'
args=args-1
end if
end repeat
if args<>0
display ' ERROR: "%" mismatch number of arguments.',10
!BUG ; это должно вызвать ошибку, т.е. просто любой Неправильный набор символов
end if
} |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.088 |