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

时间:2009-01-11 14:07:41

标签: c++ mfc refactoring

我有一个非常大的应用程序,150万行C ++,目前使用Document / View架构的MFC。该应用程序包括许多3D矢量图形,电子表格,以及很多对话框和Windows。在DVA的限制范围内,编写得相当好,因为用户界面中没有重要的程序逻辑,任何可以使用用户界面完成的操作也可以使用COM / OLE自动化接口以编程方式执行。 / p>

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

其他任何人都有更容易实施的想法吗?有人遇到任何重构或类似工具专门用来帮助这种端口吗?

6 个答案:

答案 0 :(得分:5)

简短的回答是它是可行的,不要使用java,并且这将是相当多的工作。

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

该研究的结果是它有可能。考虑的选项是Java和CGI,使用CORBA或COM / DCOM。考虑构建一个Java applet,但排除了因为它与C ++桌面版本不会有太大不同。

采取的方法是采用后端层并将其转换为位于cgi层后面的服务器应用程序。 UI大部分是使用我们现在所知的Ajax(即Javascript和HTML)重写的。 UI在浏览器元素和服务器元素之间分开。

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

我确实发现,即使在结构良好的系统中,应该在后端的相当多的代码泄漏到前端。

如果我现在要做同样的事情,有一些优秀的javascript库可以提供帮助,但我仍然采用相同的方法在浏览器中使用Ajax尽可能多地做,可能像{{ 3}}或qooxdoo。我也可能会考虑使用YUI并将至少大部分对话框移动到后端。

我的要求列表中唯一令我担忧的是3d矢量图形,尽管XULthis JS toy可能有一些里程。

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

答案 1 :(得分:4)

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

  

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

我不知道您的应用程序是什么样的以及它是“Web可移植”的好坏,但是可能正在为Web应用程序做一个精确的副本并不是最好的选择。

答案 2 :(得分:2)

查看Wt是否符合您的需求。它是一个C ++ Web应用程序工具包。

答案 3 :(得分:1)

这将是一项重要的工作,但你已经完成了很好的设计,所以你已经到了中途了!

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

修复后,您可以看到实现与后端连接所需的所有区域,您可以开始使用您喜欢的任何语言或平台重新编写UI。

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

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

答案 4 :(得分:1)

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

有必要在用户计算机上注册活动的X组件(也非常简单,但你必须重新注册组件的每个新版本 - 我觉得我填写了注册表) 现在,Internet Explorer使用activeX向网页发出警告 所以它需要用户降低I.E.的安全级别。防止它抱怨。

答案 5 :(得分:1)

是的,我们已经使用大型(Borland)C ++应用程序完成了这项工作,该应用程序最好被描述为具有“大泥球”架构。

你确实会遇到一些有趣的问题,但是我们制作了一个非常'webby'和有吸引力的前端(原型在ASP.NET中,但可能是包括Java在内的任何东西),它们主要是在桌面应用程序中运行的事件。然后,服务器显示生成的图形,表格和文本。我们可以灵活地显示图形之类的东西 - 如.PNG,flash对象或.SVG,具体取决于浏览器

工作得非常好,一旦我们整理了一个模型(设计是一个问题),只花了几个程序员的时间来实现。

目前,我们只实现了整个桌面应用程序的有用子集,但是当我们继续时,后端将更加干净地与前端分离(并减小大小)。如果你已经在GUI和后端之间有一些很好的分离,那么这是一个很大的优势。

我们还从应用程序中看到了一个很大程度上自动生成的Web界面,但在设计阶段决定它看起来太像在浏览器窗口中运行的Windows32应用程序....