从用C++编写的桌面应用程序过渡到基于Web的应用程序[已关闭]

zbq4xfa0  于 2023-01-14  发布在  其他
关注(0)|答案(4)|浏览(134)
    • 已关闭**。此问题需要超过focused。当前不接受答案。
    • 想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。

3小时前关门了。
Improve this question
我们有一个用C编写的成熟的Windows桌面应用程序。该应用程序的GUI位于Windows DLL之上,该DLL为GUI做了大部分工作(它有点像引擎)。它也是用C编写的。出于各种原因,我们正在考虑将Windows应用程序转换为基于Web的应用程序。
我想避免的是必须用C为这个基于网络的应用程序编写CGI。也就是说,我宁愿拥有像Python或. NET语言这样的4G语言来创建这个应用程序的基于网络的版本。
所以,问题是:鉴于我需要在后端使用C
DLL来完成应用程序的工作,您会推荐什么技术堆栈来介于用户的浏览器和C++ DLL之间?我们可以假设Web服务器将是Windows。
一些选项:
1.在Windows DLL之上编写一个COM层,然后可以通过. NET访问该层,并使用ASP.NET作为UI
1.直接从. NET访问导出DLL接口,并使用ASP.NET作为UI。
1.编写一个 Package windows DLL的自定义Python库,以便可以编写其余代码。
1.使用C和基于C的MVC框架(如Wt)编写CGI
关注:

  • 如果可以避免的话,我宁愿不使用C++作为Web框架--我认为Python和C#这样的语言在开发时间方面更强大、更高效。
  • 我担心我将托管和非托管代码与我所要求的. NET解决方案之一混合在一起会导致许多难以调试的小问题(这纯粹是传闻证据)
  • 使用Python层也是如此,任何稍微偏离常规的东西都让我担心,因为我没有太多的证据证明这是一个可行的长期解决方案。
s5a0g9ez

s5a0g9ez1#

另请参阅可以将现有的大型应用程序移植到Web上吗?如何移植?
抱歉,没有好的解决方案,只有不那么坏的...。
首先,由于您已经为Windows开发,我假设您习惯于使用Microsoft开发工具,我不会为来自UNIX(或Mac)的桌面应用程序给予相同的答案。
一些随意的想法和指点。

  • 我会使用Asp.net,很可能是Aps.netMVC。
  • 我会尝试在一些不错的高级.net类中 Package C++类,也许使用Managed C++ / CLI
  • 在C端使用COM可能需要做很多工作,而且不会使.NET变得容易,所以我会避免使用COM,而倾向于使用托管C或pinvoke(然而,如果您已经在C++端使用COM,这是一个选项,前提是您使用的是VB 6可以科普的COM子集)。
  • .NET不能访问非托管C对象,但是它可以使用Pinvoke访问简单的C函数,所以无论你做什么,在C站点上都需要某种桥接层。
  • 看看你是否可以使用Silverlight而不是网络,如果你能够(安装问题等),它将保存你大量的开发时间。(并让你针对微软手机以及)
  • 检查“网络端口”的商业案例是否非常有力,而且所需的时间比您想象的要长得多!,使用终端服务器等托管是否是您的客户的一个选择?
  • 考虑线程和多用户访问,例如,您的dll是否假设它只被一个用户使用?
  • 仅仅因为你正在开发一个新的网络版本,即使你已经发布了网络版本,你仍然会得到客户要求改变桌面版本。我发现在过去,目前的客户并不总是希望转移到网络应用程序。

(抱歉,我不知道Python的匹配,但是如果你还没有这方面的技能,我会说坚持微软栈,因为你已经知道微软调试器等)

  • (我认为将复杂的应用程序移植到Web上是一个非常大的痛苦,最好尽可能避免痛苦,但有时你别无选择,只能将痛苦最小化。如果你从未处理过正在移植到Web上的大型应用程序(通常需要多年的工作),你就不知道你会让自己陷入什么境地!)*
mwg9r5ms

mwg9r5ms2#

3-Python就是解决方案。
在python中创建一个单一的入口点接口,它只需要函数名和传递给函数本身的参数列表。你将有一些东西可以马上开始实验,看看第一个功能性的web原型真正需要DLL的哪些函数。
单个函数模块的存根是

#include <Python.h>
#include <string.h>

int int_function(int a){
    return a +=1;
}

static PyObject *
exec_lib(PyObject *self, PyObject *args)
{
    char *fun_name;
    PyObject *func_name = PyTuple_GetSlice(args, 0,1);
    PyObject *res;

    if (!PyArg_ParseTuple(func_name, "s", &fun_name))
         return NULL;
    Py_DECREF(func_name);
    if (strncmp("int_function", fun_name, 1024) == 0)
    {
        int i;
        PyObject *fun_args = PyTuple_GetSlice(args, 1,20);
        if (!PyArg_ParseTuple(fun_args, "i", &i))
            return NULL;
        Py_DECREF(fun_args);
        res = Py_BuildValue( "i", int_function(i));
    } else {
        Py_INCREF(Py_None);
        res = Py_None;
    }

    return res;
}


PyMethodDef methods[] = {
    {"exec_lib", exec_lib, METH_VARARGS, " Returns"},
    {NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC 
initlibwrap()
{
    (void) Py_InitModule("libwrap", methods);
}

可以使用www.example.com文件进行编译setup.py

from distutils.core import setup, Extension

setup(name = "libwrap",
      version = "1.0",
      ext_modules = [Extension("libwrap", ["my_library_wrap.cpp"])])

并用于简单的Web服务器

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import libwrap

def int_function(value):
    return libwrap.exec_lib("int_function", value)

print int_function(10)

class MyHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        self.send_response(200)
        value = 'Error'
        try:
            value = int_function()
        except:
            import traceback
            traceback.print_stack()
        self.wfile.write(value)

def main():
    try:
        ip ='localhost'
        port = 8080
        server = HTTPServer((ip,port), MyHandler)
        server.serve_forever()
    except KeyboardInterrupt:
        server.socket.close()

if __name__ == '__main__':
    main()
omqzjyyz

omqzjyyz3#

我会说选项2是可行之道。如果你在.Net中创建一个到你的DLL的接口,以确保你在需要时正确地释放你的内存等,我看不出有什么问题。如果你可以在你的DLL中重用你的业务逻辑,基本上可以在你的DLL中进行Web调用,那就太好了。
我唯一关心的是你的DLL的API。ASP.NET显然是一个多用户多线程应用程序。你的API设计成这样了吗,考虑到大多数windows窗体应用程序只有一个用户驱动它们(想象一下,如果你的应用程序中的每个窗体都可以被多个用户同时打开)。

3xiyfsfu

3xiyfsfu4#

既然没有人提到它,那么Wt怎么样?
如果你不需要一个基于资源管理器的UI,有很多C库可以让你把本地应用扩展到基于Web的应用,POCO就是其中之一。如果你坚持使用Windows平台,WWSAPI对C/C开发者来说真的很酷。

相关问题