Анализ файлов CArchive (классы MFC) в Ruby - PullRequest
0 голосов
/ 08 апреля 2010

У меня есть устаревшее приложение, которое, кажется, экспортирует / сохраняет файлы с помощью CArchive (устаревшее приложение MFC).

В настоящее время мы проводим рефакторинг инструмента для Интернета.Есть ли в Ruby библиотека для анализа и загрузки этих устаревших файлов?

Какие возможные библиотеки можно найти?

Проблемы с форматом файла в соответствии с XML-сериализациейдля MFC включают в себя: Неустойчивость - ваша программа, вероятно, вылетит, если вы прочитаете архив, созданный другой версией вашей программы.Этого можно избежать путем сложного и громоздкого управления версиями.С помощью XML этого можно в значительной степени избежать.- Тяжелые зависимости между объектной моделью вашей программы и архивированными данными .Измените модель программы, и почти невозможно прочитать данные из предыдущей версии.- Архивные данные не могут быть отредактированы , поняты и изменены, кроме как со связанным приложением.

Также - существует 4 версии устаревшего программного обеспечения, как бы я смог преодолеть эту ObjectModel,Архивные данные проблемы для разных версий?Требуются все возможности обратного (импорта).

Ответы [ 2 ]

2 голосов
/ 08 апреля 2010

У CArchive нет формата, который вы можете анализировать.Это просто двоичный файл.Вы должны знать, что в нем, чтобы знать, как это читать.Библиотека может облегчить чтение некоторых типов данных (CString, CArray и т. Д.), Но я не уверен, что вы найдете что-то подобное.

CArchive работает следующим образом (сохранение части):

CArchive ar;
int i = 5;
float f = 5.42f;
CString str("string");
ar << i << f << str;

Затем все это сбрасывается в двоичный файл.Вы должны прочитать двоичные данные и как-то их интерпретировать.Это легко в C ++, потому что MFC знает, как сериализовать типы, включая сложные типы, такие как CString и CArray.Но вам придется делать это самостоятельно, используя Ruby.

Например, вы можете прочитать 4 байта (потому что вы знаете, что int такой большой) и интерпретировать его как целое число.Следующие четыре байта для float.И затем вы должны увидеть, как загрузить CString, сначала он сохраняет длину, а затем данные, но вам нужно взглянуть на точный формат, который он использует.Вы можете создавать служебные функции для каждого типа, чтобы сделать вашу жизнь проще, но не ожидайте, что это будет просто.

1 голос
/ 09 апреля 2010

Вы можете написать экспортер в C ++, используя старую функциональность, которая будет читать в CArchive, а затем выводить xml-файл или любое другое содержимое.Чтение CArchives непосредственно из Ruby (или любого другого языка, кроме C ++ / MFC) станет серьезным проектом.Может быть, вам это сойдет с рук, если записанные данные представляют собой просто структуру с несколькими целочисленными или длинными значениями, но как только ваш CArchive содержит UDT, вас ждет мир боли.Например, я даже не думаю, что CArchive дает обещания по выравниванию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...