【问题标题】:Parsing CArchive (MFC classes) files in Ruby在 Ruby 中解析 CArchive(MFC 类)文件
【发布时间】:2010-04-08 10:25:26
【问题描述】:

我有一个旧版应用程序,它似乎正在使用 CArchive(旧版 MFC 应用程序)导出/保存文件。

我们目前正在重构网络工具。我可以在 Ruby 中查看用于解析和加载这些旧文件的库吗?

我可以查看哪些可能的库?

XML serialization for MFC文件格式的问题包括: 非鲁棒性——如果您阅读由另一个版本的程序生成的存档,您的程序可能会崩溃。这可以通过复杂且笨拙的版本管理来避免。通过使用 XML,可以在很大程度上避免这种情况。 - 程序对象模型和存档数据之间的严重依赖关系。更改程序模型,几乎不可能从以前的版本中读取数据。 - 存档数据无法编辑、理解和更改,除非使用关联的应用程序。

另外 - 存在 4 个旧版软件版本,我将如何克服这个 ObjectModel,不同版本的存档数据问题?需要全部后向(导入)能力。

【问题讨论】:

    标签: ruby mfc libraries legacy


    【解决方案1】:

    CArchive 没有您可以解析的格式。它只是一个二进制文件。你必须知道里面有什么才能知道如何阅读它。库可以使读取某些数据类型(CStringCArray 等)变得更容易,但我不确定你会找到这样的东西。

    CArchive 是这样工作的(存储部分):

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

    然后所有这些都被转储到二进制文件中。您将不得不读取二进制数据并以某种方式对其进行解释。这在 C++ 中很容易,因为 MFC 知道如何序列化类型,包括像 CStringCArray 这样的复杂类型。但是您必须使用 Ruby 自己完成此操作。

    例如,您可能会读取 4 个字节(因为您知道 int 有那么大)并将其解释为整数。接下来的四个字节为float。然后你必须看看如何加载 CString,它首先存储长度,然后存储数据,但你必须看看它使用的确切格式。您可以为每种类型创建实用程序函数以使您的生活更轻松,但不要期望这很简单。

    【讨论】:

    • 那么 CArchive 只是序列化数据类型的二进制故事空间?
    • 我拥有旧版本软件的所有代码。我可以获得数据类型等。不过,我将如何继续使用这些知识打开旧文件?
    • 所以我必须首先了解结构和格式。谢谢。
    • 格式是二进制的,但你必须复制结构。
    【解决方案2】:

    您可以使用旧功能在 C++ 中编写导出器,该功能将读取 CArchive,然后输出 xml 文件或任何内容。直接从 Ruby(或除 C++/MFC 之外的任何其他语言)读取 CArchives 将是一个重大项目。如果写入的数据只是一个带有几个整数或长整数的结构,也许你可以侥幸逃脱,但一旦你的 CArchive 包含 UDT,你就会陷入痛苦的世界。例如,我什至不认为 CArchive 承诺对齐。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 2011-04-22
      相关资源
      最近更新 更多