Логирование работы FAR ~~~~~~~~~~~~~~~~~~~~~~ Введение ~~~~~~~~ В дебажной версии предусмотрен механизм логирования. Логирование будет только если: 1. включен режим ScrollLock 2. в параметрах компиляции указаны макросы вида: - SYSLOG_XXX - SYSLOG_FARSYSLOG - SYSLOG 3. по сорцам в нужных местах раскиданы макросы типа _XXX() Если указан SYSLOG_FARSYSLOG, то FAR экспортирует 3 функции, которые можно использовать в плагинах совместно с дебажной версий FAR: void WINAPIV _export FarSysLog(const wchar_t *ModuleName,int l,const wchar_t *fmt,...); void WINAPI _export FarSysLogDump(const wchar_t *ModuleName,DWORD StartAddress,LPBYTE Buf,int SizeBuf); void WINAPI _export FarSysLog_INPUT_RECORD_Dump(const wchar_t *ModuleName,INPUT_RECORD *rec); В MSVC кроме вывода в файл логирование передается в окно результатов (используется OutputDebugString()) Вся математика логирования находится в файлах syslog.cpp/syslog.hpp. Макросы ~~~~~~~ общие макросы ~~~~~~~~~~~~~ ___FILEFUNCLINE___ выводит отдельной строкой Файл+Функция+Строка (формат "[{%s} %s() #%d]") _D() включается, если в параметрах компиляции включен _DEBUG _ALGO() предназначен для логирования "алгоритмов работы" тех или иных функций АПИ (макрос компиляции SYSLOG_ALGO). _DIALOG() диалоги (макрос компиляции SYSLOG_DIALOG) _KEYMACRO() макросы (макрос компиляции SYSLOG_KEYMACRO) _KEYMACRO_PARSE() макросы (макрос компиляции SYSLOG_KEYMACRO_PARSE) _ECTLLOG() ECTL_* команды (макрос компиляции SYSLOG_ECTL) _FCTLLOG() FCTL_* команды (макрос компиляции SYSLOG_FCTL) _ACTLLOG() ACTL_* команды (макрос компиляции SYSLOG_ACTL) _VCTLLOG() VCTL_* команды (макрос компиляции SYSLOG_VCTL) _SYS_EE_REDRAW() логирование прорисовки в редакторе (макрос компиляции SYSLOG_EE_REDRAW) _NWZ() что-то про "новый двиг" (макрос компиляции SYSLOG_NWZ) _LOGCOPYR() функция копирования (макрос компиляции SYSLOG_COPYR) _MANAGER() логирование менеджера персональные макросы ~~~~~~~~~~~~~~~~~~~~ _OT() - Олег Тараненко (макрос компиляции SYSLOG_OT) _DJ() - Дмитрий Жемеров (макрос компиляции SYSLOG_DJ) _WARP() - ... (макрос компиляции SYSLOG_WARP) _VVM() - ... (макрос компиляции SYSLOG_VVM) _IS() - ... (макрос компиляции SYSLOG_IS) _AT() - ... (макрос компиляции SYSLOG_AT) _tran() - ... (макрос компиляции SYSLOG_tran) _SKV() - ... (макрос компиляции SYSLOG_SKV) _KM() - ... (макрос компиляции SYSLOG_KM) _TREX() - ... (макрос компиляции SYSLOG_TREX) _YJH() - ... (макрос компиляции SYSLOG_YJH) Функции ~~~~~~~ функции преобразования ~~~~~~~~~~~~~~~~~~~~~~ Код клавиши в строку string __FARKEY_ToName(int Key); Код макро-опкода в строку string __MCODE_ToName(int OpCode) Код виртуальной клавиши в строку string __VK_KEY_ToName(int VkKey) "Разжевать" ECTL-команду string __ECTL_ToName(int Command) Если добавили новую ECTL-команду, то в функцию syslog.cpp::_ECTL_ToName() нужно добавить дефайн. Например, вводим ECTL_FOOBAR, в этом случае добавляем строку: DEF_ECTL_(FOOBAR), "Разжевать" FCTL-команду string __FCTL_ToName(int Command) "Разжевать" ACTL-команду string __ACTL_ToName(int Command) "Разжевать" VCTL-команду string __VCTL_ToName(int Command) EE-команду в текст string __EE_ToName(int Command) EEREDRAW-* в текст string __EEREDRAW_ToName(int Command) ESPT-* в текст string __ESPT_ToName(int Command) VE-команду в текст string __VE_ToName(int Command) Сообщение/события диалоговые в текст string __DLGMSG_ToName(int Msg) "Разжевать" INPUT_RECORD string __INPUT_RECORD_Dump(INPUT_RECORD *Rec) "Разжевать" MOUSE_EVENT_RECORD string __MOUSE_EVENT_RECORD_Dump(MOUSE_EVENT_RECORD *Rec) Линейный дамп памяти Получить строковый буфер линейного дампа памяти (после вызова этой функции нужно освободить память) string __SysLog_LinearDump(LPBYTE Buf,int SizeBuf) функции логирования ~~~~~~~~~~~~~~~~~~~ Дамп памяти void SysLogDump(const wchar_t *Title,DWORD StartAddress,LPBYTE Buf,int SizeBuf,FILE *fp=NULL) Сделать отступ void SysLog(int l); Вывести в формате (аля printf) void SysLog(const wchar_t *fmt,...) Вывести в формате (аля printf) с отступом void SysLog(int l,const wchar_t *fmt,...) Вывод в лог результата GetLastError() void SysLogLastError(void); Вывести состояние хипа void ShowHeap(); Проверить хип на corrupt void CheckHeap(int NumLine); Дамп структуры OpenPluginInfo void GetOpenPluginInfo_Dump(const wchar_t *Title,const struct OpenPluginInfo *Info,FILE *fp) Дамп входного консольного буфера ("скока там еще осталось то") void INPUT_RECORD_DumpBuffer(FILE *fp=NULL); Дамп структуры PanelViewSettings void PanelViewSettings_Dump(const wchar_t *Title,const struct PanelViewSettings &ViewSettings,FILE *fp=NULL) Дамп массива структуры PluginsStackItem void PluginsStackItem_Dump(const wchar_t *Title,const struct PluginsStackItem *StackItems,int ItemNumber,FILE *fp=NULL) Дамп экрана void SaveScreenDumpBuffer(const wchar_t *Title,const FAR_CHAR_INFO *Buffer,int X1,int Y1,int X2,int Y2,int RealScreen,FILE *fp=NULL) Дамп класса Manager void ManagerClass_Dump(const wchar_t *Title,const Manager *m=NULL,FILE *fp=NULL) Дамп GetVolumeInformation void GetVolumeInformation_Dump(const wchar_t *Title,LPCWSTR lpRootPathName, LPCWSTR lpVolumeNameBuffer,DWORD nVolumeNameSize, DWORD lpVolumeSerialNumber, DWORD lpMaximumComponentLength, DWORD lpFileSystemFlags, LPCWSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize,FILE *fp=NULL) Дамп WIN32_FIND_DATA void WIN32_FIND_DATA_Dump(const wchar_t *Title,const WIN32_FIND_DATA &fd,FILE *fp=NULL) Классы ~~~~~~ CleverSysLog - "умный логер": конструктор делает отступ, в деструкторе отступ возвращается обратно.