Итак. Предприятие с Отладчиком общаются посредство отображаемого в память файла (далее файл) и сообщениями Windows. При старте 1С создаёт файл посредством метода CTraceInterface:: Open(). При наступлении определенного события Предприятие посылает Отладчику сообщение методом CTraceInterface::SendCommandToTracer(). Для синхронизации используется Mutex. При запуске отладчик заполняет в файле некоторые поля: устанавливает хэндл своего окна и путь к базе данных. CTraceInterface - основной класс, используемый для связи Предприятия с Отладчиком. Опишем его основные методы и атрибуты: 1. static class CTraceDataMap * m_pData. В этом атрибуте хранится адрес данных файла. 2. static class CTraceDataMap * Open(). Создаёт файл. Основные функции метода: a. m_hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 4316, "1Cv77MapedFile"); b. LPVOID pData = MapViewOfFile(m_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 4316); c. m_pData = (CTraceDataMap *)pData; 3. static int IsTraced(). В режиме «Предприятия» проверяет, запущен ли Отладчик. Проверяет заполнен ли hWnd отладчика, проверяет существует ли окно с таким хэндлом функцией IsWindow(), сравнивает путь к базе с путём, который установил Отладчик. Если всё правильно, возвращает 1 иначе 0. В основном вызывается из класса CBLModule7 из методов OnStartExecution(), OnNextLine(), OnStopExecution(), OnEnterProc(), OnExitProc(), ModifyBreakPoints(), StopProfileOnExit(). 4. static class CTraceDataMap * GetData(). Возвращает атрибут m_pData. Вызывается в основном там же где и метод IsTraced(). 5. static void SendCommandToTracer(). В режиме «Предприятия» посылает сообщение Windows Отладчику вызовом функции SendMessage(hWnd, 273, 32846, 0). hWnd – хэндл окна отладчика. В основном вызывается из класса CBLModule7 из методов OnNextLine(), OnStopExecution(), ModifyBreakPoints(), StopProfileOnExit().
Структура файла: class CMyBreakPoint { public: int m_LineNumber; // номер строки модуля int m_Enabled; // признак активной точки останова int m_ConditionStringLength; // длина выражения в условии точки останова int m_Unkn1; };
class CTraceDataMap { public: HANDLE m_hWnd; // Хэндл окна отладчика int m_IsTraceeActive; // возвращает CTraceInterface::IsTraceeActive() int m_Unkn1; char m_DBDir[0x104]; // путь к базе данных int m_Unkn4; int m_Unkn5; int m_Unkn6; char m_ModuleName[0x100]; // замечены строки: ModuleText, SubList, Subconto, Journal, Document и т.д. int m_Unkn8; int m_Unkn9; int m_ModuleId; // возможно Ид модуля. В основном совпадает с Ид метаданных. int m_LineStoped; // возвращает CTraceInterface::GetLineStoped() int m_Unkn11; int m_Unkn12; CMyBreakPoint m_MyBreakPoints[200]; // массив точек останова. На один модуль максимум 200. char m_Unkn13[0x100]; // возможно строка с выражением, которое вычисляет Предприятие. Замечены выражения из табло Отладчика и условий точек останова. char m_Unkn14[0x100]; // возможно строка с результатом вычисления выражения int m_Unkn15; int m_Unkn16; int m_Unkn17; int m_Unkn18; int m_Unkn19; int m_Unkn20; int m_Unkn21; int m_Unkn22; int m_Unkn23; int m_IsProfilerOn; // возвращает CTraceInterface::IsProfilerOn() };
|