将基于桌面的 MFC C++ 应用程序转换为 Web 应用程序是不是可行

Posted

技术标签:

【中文标题】将基于桌面的 MFC C++ 应用程序转换为 Web 应用程序是不是可行【英文标题】:Is it feasible to convert a desktop based MFC C++ application to a web app将基于桌面的 MFC C++ 应用程序转换为 Web 应用程序是否可行 【发布时间】:2009-01-11 14:07:41 【问题描述】:

我有一个非常大的应用程序,有 150 万行 C++,目前基于 MFC,使用 Document/View 架构。该应用程序包括大量 3d 矢量图形、电子表格以及非常多的对话框和窗口。在 DVA 的约束下,它写得相当好,因为用户界面中没有重要的程序逻辑,任何可以使用用户界面完成的事情也可以使用 COM/OLE 自动化界面以编程方式执行。

应许多用户的要求,我一直在考虑为程序创建一个浏览器界面,程序本身在服务器上运行。到目前为止的想法是将所有 COM 接口转换为 DCOM 并将 UI 重写/移植到 Java。初步实验表明,这将是一项巨大的工作。

还有其他人对更容易实施有任何想法吗?有人遇到过任何重构或类似工具专门帮助这种移植吗?

【问题讨论】:

1.5MLoc - 到网络?不如你我。我的建议:告诉用户网络是一种时尚,很快就会流行起来:) @RHM,我的想法完全正确,因此问题中的“可行”一词。 【参考方案1】:

简短的回答是可行的,不要使用java,这将是一个相当大的工作量。

几年前(大约在 IE5 时代),一位客户要求我回答一个与此类似的问题。有问题的应用程序是一个结构良好的三层桌面应用程序。

研究的结果是这是可能的。考虑的选项是 Java 和 CGI​​,使用 CORBA 或 COM/DCOM。考虑过构建 Java 小程序,但被排除了,因为它与 C++ 桌面版本没有太大区别。

采用的方法是采用后端层并将其转变为位于 cgi 层后面的服务器应用程序。 UI 在很大程度上是使用我们现在所知的 Ajax 重新编写的,即 javascripthtml。用户界面分为浏览器元素和服务器元素。

我确实考虑过编写一个工具来转换文档、视图和对话框,并将它们包装成兼容的格式,但是经过大量分析后,很明显这样做并不可行,因为 MFC 实际上与Win32 API 及其本身。根据对话框的数量,可能值得写一些东西来转换它们。

我确实发现,即使在结构良好的系统中,也有相当一部分本应位于后端的代码已经泄漏到前端。

如果我现在要做同样的事情,有一些优秀的 javascript 库会有所帮助,但我仍然会采取同样的方法,在使用 Ajax 的浏览器中做尽可能多的事情,可能类似于 @987654321 @ 或 YUI。我也可能会考虑使用XUL 并将至少大部分对话框移至后端。

在您的要求列表中,我唯一关心的是 3d 矢量图形,尽管 this JS toy 或 JS3D 可能有一些里程数。

这只是一个简短的总结,因为我试图避免写论文。

【讨论】:

感谢您的详尽回答。看起来工作量很大,所以我必须首先检查收益是否值得付出努力。【参考方案2】:

在考虑将 MFC 应用程序转换为 Web 应用程序之前,我建议您阅读 Jeff Atwood 的“Avoiding The Uncanny Valley of User Interface”。

如果您正在考虑或积极构建 Ajax/RIA 应用程序,您应该考虑用户界面设计的 Uncanny Valley。当您构建“Web 浏览器中的桌面”样式的应用程序时,您违反了用户对 Web 应用程序的外观和行为方式的不成文期望。这种选择可能会对可学习性、使用的愉悦性和采用产生重大的负面影响。

我不知道您的应用程序是什么样子以及它的“网络可移植性”有多好,但也许为网络应用程序的精确副本不是最佳选择。

【讨论】:

【参考方案3】:

看看Wt 是否能满足您的需求。它是一个 C++ Web 应用程序工具包。

【讨论】:

【参考方案4】:

这将是大量的工作,但你已经完成了好的设计,所以你已经完成了一半!

我首先将您的 MFC UI 移动到一个单独的可执行文件中,并使用它来驱动后端代码。完成此操作后(这应该相对容易,因为您只是重新打包现有代码),然后您将更好地了解它是否能够处理连接到单个后端服务器的多个用户。

一旦解决了这个问题,您就可以看到需要实现与后端的连接的所有区域,并且可以开始使用您喜欢的任何语言或平台重新编写 UI。

对于网络界面,我会编写与您的后端服务器交互的网络服务器代码。通过这种方式,您可以获得更轻松的耦合,并且您需要担心的安全性和连接性问题要少得多。我一直认为网络服务器+浏览器是 n 层应用程序中的表示层。

对于网络技术,您可以使用 flex、activex、silverlight 或可能的 jquery/jsext 将丰富的内容导入浏览器。

【讨论】:

【参考方案5】:

几年前我一直在玩这个,但我曾经尝试过使用一个小应用程序并将其编译为一个活动的 X 组件,然后可以轻松地在网页中使用它。 (这个应用程序是基于一个用 Borland C++ Builder 创建的表单,所以让它成为一个活动的 X 组件是相当简单的。我无法判断它有多难 将您的 MFC D/V 应用程序包装为 Active X 组件)。

有必要在用户机器上注册活动的 X 组件(也很简单,但是您必须重新注册组件的每个新版本——我觉得我正在填写注册表) 现在的 Internet Explorer 使用 activeX 对网页发出警告 因此它需要用户降低 I.E. 中的安全级别。以免它抱怨。

【讨论】:

【参考方案6】:

是的,我们已经通过一个大型(Borland)C++ 应用程序做到了这一点,该应用程序可以最好地描述为具有“大泥球”架构。

您确实有一些有趣的问题,但我们制作了一个非常“webby”且有吸引力的前端(原型在 ASP.NET 中,但可以是包括 Java 在内的任何东西),它主要只是在运行在服务器,然后显示生成的图形、表格和文本。我们可以灵活地显示诸如图形之类的东西 - 取决于浏览器,可以显示为 .PNG、flash 对象或 .SVG

工作得非常好,一旦我们整理好模型(设计是一个问题),只需要几个月的程序员就可以实现。

目前,我们只实现了整个桌面应用程序的一个有用的子集,但随着我们的继续,后端将与前端更清晰地分离(并缩小尺寸)。如果您已经在 GUI 和后端之间进行了很好的分离,那么这是一个很大的优势。

我们还研究了从应用程序中自动生成的网络界面,但在设计阶段决定它看起来太像在浏览器窗口中运行的 Windows32 应用程序......

【讨论】:

以上是关于将基于桌面的 MFC C++ 应用程序转换为 Web 应用程序是不是可行的主要内容,如果未能解决你的问题,请参考以下文章

在 java 中转换 MFC 桌面应用程序 GUI

在 MFC C++ 中将 char 数组转换为 UNICODE

从用 C++ 编写的桌面应用程序过渡到基于 Web 的应用程序

如何在 C++(MFC) 中将 char* 转换为 LPCTSTR

将位图 (bmp) 转换为具有透明度的 png (Windows c++)

基于 MFC 容器的应用程序