Итак, задача: требуется переписать конвертер в формат mxl. Конвертер активно использует MFC-шный CArchive, поэтому желательно найти ему похожую замену. После некоторых поисков был выбран boost::archive::binary_oarchive. Он, правда, предназначен для сериализации. Например, он позволяет использовать один и тот же код как для загрузки, так и для выгрузки:
В зависимости от типа архива код ar & m_Member будет или записывать в архив переменную m_Member или читать ее оттуда. Также можно использовать синтаксис ar << m_Member, что уже совсем близко к CArchive.
Один недостаток: т.к. один и тот же код используется как для загрузки, так и для выгрузки, то нельзя передавать в архив ссылку на константу. Например, так уже не напишешь:
Приходится писать примерно так:
Попробовал сделать тестовый проект. Выяснилось, что на этот раз одними заголовками не обойдешься – нужно собирать Буст. У меня стоял 1.33. Решил заодно перейти на 1.34. Скачал, начинаю собирать. Для сборки запускаю отдельную консоль, в которой запускаю батник vcvars32 из Студии. Его пришлось поправить – он не соответствовал настройкам в Студии. Также нужно в PATH прописать каталог с компилятором Intel. Собираю командой bjam --toolset=intel stage.
При сборке вылезает куча ошибок линковки, связанных с basic_string<wchar_t... В Гугле нахожу, что STLport должен быть собран с опцией /Zc:wchar_t (т.е. wchar_t должен быть встроенным типом, а не синонимом unsigned short). Пересобираю STLport. Естественно, сначала забываю удалить следы предыдущей сборки и поначалу от пересборки результатов нет. Но все кончается благополучно.
Для проверки пересобираю Yoksel. Естественно вылезает куча ошибок линковки из-за Cpp Unit?, собранного со старым вариантом STLport. Требуется пересобрать Cpp Unit?. Т.к. VC6 не поддерживает встроенный wchar_t, сборка делается в VS2005 + IC. Обязательно надо отключить buffer security check. Иначе эта опция сразу или потом приведет к ошибке линковки.
Опять пересобираю Yoksel. Все равно вылезает несколько ошибок линковки. Почему-то опция Treat wchar_t as Built-in type компилятором не воспринимается. Приходится явно в командной строке писать «/Zc:wchar_t". Теперь порядок.
Пересобираю Буст. Теперь ошибок линковки нет. Собирается.
Делаю тестовый проект для проверки работы boost::archive::binary_oarchive. Выясняю, что Буст собран в двух вариантах: статическая линковка всего или динамическая линковка всего. Мне же нужно STLport линковать статически, а CRT – динамически. Поковыряв немного систему сборки делаю достаточно кривое исправление в файле intel-win.jam, которое приводит, однако, к нужному результату:
Пересобираю модуль сериализации (один модуль можно пересобрать, если использовать ключ --with-libname. Например, --with-date_time). Пересобираю тестовый проект – все нормально. Правда почти ничего не делающий exe весит 400К, однако не содержит никаких лишних зависимостей. В исходном варианте появлялись зависимости от stlport.5.1.dll и libmmd.dll
Пробую пересобрать Yoksel с прописанными заголовками от Буста 1.34. Почти все нормально проходит нормально. Однако ломается следующий код:
Этот код – практически, один в один код из примера по string_algo... Вылезают ошибки в boost::function. Подмена заголовков string_algo на старые проблему не решает. Возвращаю их назад и пробую подменить заголовки function. Теперь нормально. «Но вкус у победы какой-то странный».