Предлагается более удачное решение.
Исходники находятся здесь:
http://yoksel.cvs.sourceforge.net/yoksel/SpreadSheet/Utils1s/Context/Тесты к ним находятся здесь:
http://yoksel.cvs.sourceforge.net/yoksel/SpreadSheet/Tests/Utils1s/Context/Памятка по использованию находится здесь:
http://yoksel.sourceforge.net/?wakka=PamjatkaPoUtils1sContext&v=9aqДля демонстрации использования решения создана ВК Michele - позволяет рисовать в окне 1С методами GDI и сохранять созданное изображение в файл формата BMP, JPG или PNG. ВК находится здесь:
http://uzhast.fatal.ru/Michele/Краткое описание решения.
Оберточные классы представляют собой шаблоны C++. Никаких макросов для реализации использовано не было. Справедливости ради можно отметить, что сообщения компилятора при использовании шаблонов в случае ошибок так же не блещут понятностью, как и при использовании макросов. Однако шаблоны не могут выйти из своего пространства имен, ведут себя более предсказуемо, место ошибки показывается гораздо точнее.
Решение позволяет строит переходники почти к любому произвольному классу C++. Будем называть такие классы основными. Основной класс может вообще не знать о существовании 1С, типов CValue и CBLContext. Мы просто указываем компилятору, чтобы он сгенерил переходник к основному классу и указываем к каким методам и свойствам следует создать обертки. Мы просто указываем RegisterMethod ("РусИмя", "EngName", MainClass::Method). Далее мы можем менять количество параметров у метода, менять типы параметров и возвращаемое значение. Определение контекста при этом менять не нужно. Достаточно перекомпилировать проект и компилятор автоматически создаст метод-обертку, для измененного метода основного класса.
Если метод использует параметры по умолчанию, то их мы также описываем при вызове RegisterMethod. При этом мы используем реальные типы (число, строка и т.д.) - работать с CValue не нужно. Также нет никакой необходимости в мусорных функциях, сообщающих 1С о параметрах по умолчанию - весь этот мусор будет сгенерирован автоматически.
Контекстный класс-обертка не связан отношениями наследования с основным классом. Он может единолично владеть объектом основного класса, разделять владение с другими объектами или может быть просто подключен к существующему объекту основного класса.
Регистрация контекстных классов происходит полностью автоматически и децентрализовано. Нет никаких зависимостей от стартап кода.
Плюсы решения.
Можно создавать контексты для уже существующих классов C++. Например, см. в Michele реализацию Michele::CFont и Michele::CBrush - это автоматические обертки над MFC-шными CFont и CBrush.
Основной класс не связан с 1С и ее заморочками. Он не знает про CValue. Он работает со своими родными типами. Это увеличивает возможность повторного использования решения. Например, для основного класса можно сделать переходник не для CBLContext, а для ILanguageExtender, что позволит использовать этот класс не только в 7.7, но и в 8.х. Или можно сделать переходник для IDispatch, что позволит работать с классом по OLE-automation.
Написание контекстных классов становится удовольствием. Их можно создавать быстро и работать с ними становится удобно. В определении класса видны его реальные параметры и возвращаемое значение.
Классы удобно использовать из C++. В несколько раз упрощается тестирование этих классов.
Недостаток: решение невозможно использовать с компилятором VC6. Необходимо использовать более современный компилятор - Intel C++.