【问题标题】:Are there guidelines for updating C++Builder applications for C++Builder 2009?是否有针对 C++Builder 2009 更新 C++Builder 应用程序的指南?
【发布时间】:2010-09-14 05:31:41
【问题描述】:

我有一系列使用 C++Builder 从 BCB5 开始开发的 Win32 VCL 应用程序,并希望将它们移植到 ECB2009 或现在的任何名称。

我的一些应用程序使用旧的 TNT/TMS unicode 组件,因此我在整个代码中很好地混合了 AnsiStrings 和 WideStrings。新版本引入了 UnicodeString,以及一堆改变 c_str 等函数行为方式的#defines。

我想以尽可能向后兼容的方式修改我的代码,以便在必要时仍可以在 BCB2007 上编译和运行相同的代码库(以非 unicode 方式)。

特别关注的领域是:

  • 向/从 Win32 API 传递字符串 功能
  • 与 TXMLDocument 互操作
  • 用于 RS232 通信等的“原始”字符串。

我正在寻找可以应用的指南来简化迁移,同时尽可能保持向后兼容性,而不是刀叉更改。

如果还没有这样的指导方针,也许我们可以在这里制定一些?

【问题讨论】:

    标签: unicode c++builder vcl


    【解决方案1】:

    对于不需要显式 Ansi 或显式 Unicode 的任何代码,您应该考虑尽可能使用 System::String、System::Char 和 System::PChar 类型定义。这将有助于简化大量迁移,并且它们可以在以前的版本中使用。

    将 System::String 传递给 API 函数时,您必须考虑项目选项中新的“TCHAR 映射到”设置。如果您尝试在“TCHAR 映射到”设置为“wchar_t”时传递 AnsiString::c_str(),或者当“TCHAR 映射到”设置为“char”时传递 UnicodeString::c_str(),则必须执行适当的类型转换。如果您将“TCHAR 映射到”设置为“wchar_t”。从技术上讲,UnicodeString::t_str() 与 API 中的 TCHAR 做同样的事情,但是如果你误用它,t_str() 可能会非常危险(当“TCHAR 映射到”设置为“char”时,t_str() 会转换UnicodeString 的内部数据到 Ansi)。

    对于“原始”字符串,您可以使用新的 RawByteString 类型(虽然我不推荐它),也可以使用 TBytes(这是一个字节数组 - 推荐)。您不应该将 Ansi/Wide/UnicodeString 用于非字符数据。在过去的版本中,大多数人使用 AnsiString 作为临时数据缓冲区。不要再这样做了。这一点尤其重要,因为 AnsiString 现在可以识别代码页,因此您的数据可能会在您最不期望的时候转换为其他代码页。

    【讨论】:

      【解决方案2】:

      最大的问题是对 C++Builder 2009 和以前版本的兼容性,Unicode 差异是一些,但项目配置文件也发生了变化。根据我在CodeGear forums 上的讨论,在这件事上没有太多选择。

      如果您还没有这样做,我认为首先要开始的是C++Builder 2009 release notes

      看到的最大的事情是 TCHAR 映射(到 wchar 或 char);使用 STL 字符串变体可能会有所帮助,因为它们在两个版本之间应该没有太大区别。该映射也存在于 C++Builder 2007 中(带有 tchar 标头)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 2013-02-15
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多