2009-12-14 46 views
5

Chúng tôi có ứng dụng Windows desktop trưởng thành được viết bằng C++. GUI của ứng dụng nằm trên đỉnh của một cửa sổ DLL mà hầu hết các công việc cho GUI (đó là loại động cơ). Nó cũng được viết bằng C++. Chúng tôi đang xem xét việc chuyển ứng dụng Windows thành ứng dụng dựa trên web vì nhiều lý do khác nhau.Chuyển đổi từ ứng dụng dành cho máy tính để bàn được viết bằng C++ sang ứng dụng dựa trên web

Điều tôi muốn tránh là phải viết CGI cho ứng dụng dựa trên web này trong C++. Đó là, tôi thà có sức mạnh của một ngôn ngữ 4G như Python hoặc ngôn ngữ .NET để tạo phiên bản dựa trên web của ứng dụng này. Vì vậy, câu hỏi là: cho rằng tôi cần phải sử dụng một DLL C + + trên backend để làm công việc của ứng dụng ngăn xếp công nghệ nào bạn muốn giới thiệu cho ngồi giữa trình duyệt của người dùng và là C + + dll? Chúng ta có thể giả định rằng máy chủ web sẽ là Windows.

Một số tùy chọn:

  1. Viết một lớp COM trên đầu trang của các cửa sổ DLL sau đó có thể được truy cập thông qua NET và sử dụng ASP.NET cho giao diện người dùng
  2. Truy cập diễn đàn xuất khẩu giao diện DLL trực tiếp từ. NET và sử dụng ASP.NET cho giao diện người dùng.
  3. Viết thư viện Python tùy chỉnh bao bọc cửa sổ DLL để phần còn lại của mã có thể được viết.
  4. Viết CGI sử dụng C++ và C++ - khung MVC dựa như Wt

Mối quan tâm:

  • Tôi không muốn sử dụng C++ cho khuôn khổ web nếu nó có thể tránh được - Tôi nghĩ rằng ngôn ngữ như Python và C# đơn giản hơn và hiệu quả hơn về thời gian phát triển.
  • Tôi lo ngại rằng mã được quản lý và không được quản lý của tôi trộn với một trong các giải pháp .NET tôi đang yêu cầu rất nhiều vấn đề nhỏ khó gỡ rối (bằng chứng hoàn toàn giai thoại)
  • Tương tự như vậy khi sử dụng một lớp Python. Bất cứ điều gì đó là hơi ra khỏi con đường bị đánh đập như lo lắng cho tôi trong đó tôi không có nhiều bằng chứng một cách này hay cách khác nếu đây là một giải pháp lâu dài khả thi.
+0

Bằng "ứng dụng web", tôi giả sử bạn có nghĩa là HTML/CSS/Javascript, thay vì RIA như Flash hoặc Silverlight? –

+0

Tôi làm, vâng. Ứng dụng cuối cùng có thể chứa một số phần tử flash/sl nhưng chúng không phải là nền tảng. – Karim

Trả lời

10

Xem thêm Can a huge existing application be ported to the web? How?

Xin lỗi không có giải pháp tốt, chỉ cần những người ít xấu ....

Thứ nhất như bạn đã phát triển cho các cửa sổ Tôi giả định rằng bạn đang sử dụng để sử dụng các công cụ phát triển của Microsoft, tôi sẽ không đưa ra câu trả lời tương tự cho một ứng dụng máy tính để bàn đến từ unix (hoặc Mac).

Một số suy nghĩ và con trỏ ngẫu nhiên.

  • Tôi sẽ sử dụng Asp.net nhiều khả năng nhất Aps.net MVC.
  • Tôi sẽ thử bọc trong các lớp C++ ở một số lớp .net cao cấp đẹp, có thể sử dụng Managed C++/CLI.
  • Sử dụng COM có nhiều khả năng làm việc ở bên C++ và không làm cho .NET dễ dàng, vì vậy tôi sẽ tránh COM có lợi cho quản lý C++ hoặc pinvoke (Tuy nhiên nếu bạn allready sử dụng COM ở phía C++ , đây là một tùy chọn, miễn là bạn đang sử dụng tập hợp con của COM mà VB6 có thể đối phó với).
  • .NET không thể truy cập đối tượng C++ được quản lý, nhưng nó có thể truy cập chức năng C đơn giản bằng cách sử dụng Pinvoke, vì vậy bất cứ thứ gì bạn thực hiện một số lớp cầu nối sẽ cần trên trang C++.
  • Xem bạn có thể sử dụng Silverlight thay vì web hay không, nếu bạn có thể (cài đặt các vấn đề vv), nó sẽ giúp bạn tiết kiệm rất nhiều thời gian phát triển. (Và cũng cho phép bạn nhắm mục tiêu đến Điện thoại Microsoft)
  • Kiểm tra xem trường hợp doanh nghiệp cho “cổng vào web” rất mạnh và sẽ mất nhiều thời gian hơn lâu hơn bạn nghĩ!, Đang lưu trữ với máy chủ đầu cuối, v.v. tùy chọn cho khách hàng của bạn?
  • Suy nghĩ về luồng và truy cập nhiều người dùng, ví dụ: không dll của bạn giả định nó chỉ được sử dụng bởi một người dùng?
  • Chỉ vì bạn đang làm việc trên một phiên bản web mới, bạn sẽ vẫn nhận được khách hàng yêu cầu thay đổi đối với phiên bản máy tính để bàn ngay cả sau khi bạn đã chuyển phiên bản web. Tôi đã tìm thấy trong quá khứ rằng khách hàng hiện tại không phải lúc nào cũng muốn chuyển sang ứng dụng web.

(Xin lỗi tôi không biết trận đấu về Python, tuy nhiên nếu bạn chưa có kỹ năng trong đó tôi sẽ nói dính trên Microsoft ngăn xếp như bạn đã biết Microsoft debugger vv)


(tôi nghĩ về porting các ứng dụng phức tạp lên web như một nỗi đau rất lớn, nó là tốt nhất để tránh đau khi có thể tuy nhiên đôi khi bạn được cấp không có lựa chọn và chỉ phải giảm thiểu sự đau đớn. Nếu bạn có bao giờ làm việc trên các ứng dụng lớn đang trong quá trình (thường là nhiều năm ork) đang được chuyển vào web, bạn chỉ không biết mình đang để mình làm gì!)

+0

+1 cho "Được lưu trữ với máy chủ đầu cuối vv một tùy chọn?" –

+0

Điểm tốt. Đường dẫn ứng dụng web đang được xem xét vì 1) triển khai dễ dàng hơn cho khách hàng 2) nâng cấp dễ dàng hơn 3) chu kỳ phát triển nhanh hơn cho các thay đổi gui. Silverlight không phải là thứ tôi muốn xem xét - nên là một giao diện người dùng dựa trên HTML/JS để tránh các phụ thuộc trình duyệt/nền tảng sơ sài. – Karim

+0

Sử dụng giao diện người dùng dựa trên HTML/JS là cách tốt nhất để có được các phụ thuộc trình duyệt sơ sài mà tôi biết. – rpg

2

Tôi muốn nói tùy chọn 2 là cách để đi. Miễn là bạn tạo một giao diện trong. Net để DLL của bạn để chắc chắn rằng bạn phát hành chính xác bộ nhớ của bạn, vv khi cần thiết tôi không thấy một vấn đề. Nếu bạn có thể tái sử dụng logic kinh doanh của bạn trong DLL của bạn và về cơ bản thực hiện một cuộc gọi web vào DLL của bạn sau đó tuyệt vời.

Mối quan tâm duy nhất của tôi sẽ là API của DLL của bạn. ASP.Net rõ ràng là một ứng dụng đa luồng đa người dùng. API của bạn được thiết kế để thực hiện điều này, vì hầu hết các cửa sổ tạo ứng dụng sẽ chỉ có một người dùng điều khiển chúng (hãy tưởng tượng nếu mọi ứng dụng trong ứng dụng của bạn có thể được mở bởi nhiều người dùng cùng một lúc).

4

3- Python là giải pháp.

Tạo giao diện điểm nhập bằng sigle trong trăn chỉ lấy tên của hàm và danh sách các thông số để chuyển đến chính hàm đó. Bạn sẽ có một cái gì đó để bắt đầu thử nghiệm ngay lập tức và xem những chức năng của DLL là thực sự cần thiết cho các nguyên mẫu web chức năng đầu tiên.

Một stub cho một mô-đun chức năng duy nhất là

#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); 
} 

thể được biên dịch với một thiết lập.tập tin

from distutils.core import setup, Extension 

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

py và được sử dụng trong một máy chủ web đơn giản như

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() 
+0

Cảm ơn! Đây là thông tin tuyệt vời. Tôi ước tôi có thể đánh dấu hai câu trả lời được chấp nhận :) – Karim

1

Vì không ai đã đề cập đến nó, làm thế nào về Wt.

Nếu bạn không tìm kiếm giao diện người dùng dựa trên trình khám phá, có nhiều thư viện C++ để bạn mở rộng ứng dụng cục bộ lên ứng dụng dựa trên web, POCO là một trong số đó. Nếu bạn đang gắn bó với nền tảng Windows, WWSAPI, thực sự tuyệt vời cho các nhà phát triển C/C++.

Các vấn đề liên quan