将 Delphi 逐步移植到 C++

Posted

技术标签:

【中文标题】将 Delphi 逐步移植到 C++【英文标题】:Port Delphi to C++ gradually 【发布时间】:2009-05-18 11:09:02 【问题描述】:

我有一个用 Delphi 编写的大型应用程序。我想更新它,从用户界面开始。我考虑过使用新的Qt。在更新它的过程中,我想更改为 C++ 作为编程语言。 有没有办法逐步重写应用程序(从 UI 开始)以更改为 C++?

感谢您的帮助。

【问题讨论】:

我将此作为评论添加,因为我的 Delphi/Borland 体验几年前就结束了。但是,我认为 Borlands C++ 编译器也会成功构建 Delphi 文件。您也许可以在同一个项目中混合使用语言。你应该试试看。 如果需要更改,为什么不切换到 delphi 2009 并继续使用原生 UI、VCL 而不是 QT? 为什么需要从 Delphi 切换到 C++?你想要跨平台吗? 也许这也很有趣:***.com/questions/619272/qt-for-delphi-developers 【参考方案1】:

最佳行动方案很大程度上取决于 C++ 开发环境。

如果是 C++ Builder 你有两种可能:

使用运行时包而不是普通的 DLL。当涉及到字符串编组和将类层次结构映射到平面 DLL 函数时,这将使您省去很多麻烦。

使用混合代码。您可以在同一个项目中混合使用 Delphi/Pascal 代码和 C++ 代码。 (虽然单个模块/单元中只有一种语言)

如果是其他任何 C++ 编译器:

按照您建议的方式使用 DLL。您必须创建某种层/外观来将您的类的功能映射到平面 DLL 函数。

1234563 @s 而不是 PChars。

创建 .objs 而不是 .dcus,以便两个编译器使用相同的输出格式。然后将它们直接链接到您的 C++ 程序中。这与创建 DLL 基本相同,但它是静态的。您将在编译时而不是运行时发现某些类型的错误。

【讨论】:

我对此并不满意,但我想事情就是这样。谢谢大家的见解。【参考方案2】:

换一种方式可能更容易——用 C++ 重写业务逻辑并通过 C 接口从 Delphi 调用它。尤其如此,因为 Delphi 的主要优势之一是使用 GUI。

【讨论】:

【参考方案3】:

将您的 Delphi 应用程序转换为 dll-s。您应该找出一些合理的 API 并将其公开在 dll 中。然后使用 C++ 应用程序中的那个 dll-s。

也有可能创建 COM+ 对象,但它们是特定于 Windows 的技术(因为 QT,我想您打算创建多平台应用程序)。

【讨论】:

【参考方案4】:

总的来说,虽然有异种语言选项,但我总是发现冻结旧版本并用新语言重写下一个主要版本最终会更省时。

但我反其道而行之。 (增加我最终向后移植到 Delphi 的 C++ 百分比)

【讨论】:

【参考方案5】:

我有同样的需求 - 将 9 年历史的项目从 D2010 迁移到 QT 4.6,大约 300K+ 行代码。 我决定做以下事情:

    使用 DISql3 将 ADO 依赖项移植到 Delphi 中的 SQLite 驱动程序。 将我的 MS 数据库迁移到 SQLite 通过将 db 控件放入包装数据访问类和其他 UI 相关控件(如表单中的 ImageList)中来移除数据模块。 明确区分模型(数据库访问)、视图(表单)和控制器。从这种方式开始,我可以开始移植模型和控制器并逐步执行单元测试 最终将视图(表单)迁移到 QT 对话框。这是最难的部分,因为一个普通的应用程序至少依赖于 3-4 个第三方控件。例如,我在 VCL 中大量使用 DevExpress,并计划用 QTitan (http://www.devmachines.com/qtitan_grid_overview.php) 替换它

目前我处于第 2 阶段,但我非常有信心增量方法会奏效。

【讨论】:

【参考方案6】:

我理解你,因为我也是一名 delphi 开发人员,我也想将我的代码迁移到 QT 框架,即 c++ 中。 我想达到跨平台的目标:所以我放弃了保留原始源代码的dll解决方案,因为它迫使我保持​​delphi IDE处于待机状态。我不想再回去编写/修复/改进delphi代码了..我想进化! 我看到的唯一选择是用c++重写delphi代码并用QT creator重新编译(详细地说,它将用QT creator调用的g++ mingw编译器重新编译。)

重写代码将为您提供重构类以符合“QTed”的机会。 gui 也将被完全重写,因为 VCL 是事件驱动的,而 QT 是信号驱动的,但我想你已经知道了。

请记住:保持您的 delphi 代码完整并将其构建为 dll 库或将其编译为 objs,将迫使您继续维护 delphi 源代码。

【讨论】:

使用 CodeTyphon 可以更轻松地实现跨平台。是一款功能强大的跨平台原生pascal开发的一键安装包。它已经支持 4 个 CPU/OS 主机(Win32、Win64、Linux32、Linux64)和 16 个 CPU/OS 目标(arm-Wince、arm-Linux、arm-Embedded、arm-gba、arm-nds、i386-Win32、i386 -Linux, i386-FreeBSD, i386-Haiku, x86_64-Win64, x86_64-Linux, x86_64-FreeBSD, powerpc-Linux, powerpc64-Linux, sparc-Linux, sparc-Solaris)。 Lazarus/FreePascal 支持更多。 pilotlogic.com/sitejoom/…

以上是关于将 Delphi 逐步移植到 C++的主要内容,如果未能解决你的问题,请参考以下文章

将多线程 Delphi 应用程序移植到 Mac:我的选择是啥?

将 python 代码移植到 C++ /(在 C++ 中打印出数组)

将 GNU C++ 程序移植到 Visual C++

Delphi 7程序移植到 Delphi XE上的一些小情况

DRT移植各种成熟稳定的C工具包到DELPHI

将 C++ 类移植到 PyQt