Есть ли полный аналог dbgprint для user mode outputdebugstring не позволяет использовать %d, %s и т.д.
Сам понял что нет Сделал так: Код (Text): #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 не корректен - передается только один параметр. Как передать все ?
А если так: Код (Text): #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 символов, длина не проверяется. <font face="monospace] Код (Text): ; можно без структуры обойтись, ; заменив _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 } </font><!--face-->