2009-12-14 11 views
5

में संक्रमण हमारे पास एक परिपक्व विंडोज डेस्कटॉप एप्लिकेशन है जो सी ++ में लिखा गया है। एप्लिकेशन का जीयूआई विंडोज़ डीएलएल के शीर्ष पर बैठता है जो जीयूआई (यह इंजन का प्रकार है) के लिए अधिकांश काम करता है। यह भी सी ++ में लिखा गया है। हम विभिन्न कारणों से एक वेब-आधारित ऐप होने के लिए विंडोज ऐप को संक्रमण करने पर विचार कर रहे हैं।सी ++ में लिखे गए डेस्कटॉप एप से वेब-आधारित ऐप

मैं क्या करना चाहता हूं सीजीआई में इस वेब-आधारित ऐप के लिए सीजीआई लिखना है। यही है, मेरे पास इस ऐप के वेब-आधारित संस्करण बनाने के लिए पाइथन या .NET भाषा जैसी 4 जी भाषा की शक्ति होगी।

तो, सवाल यह है कि: मुझे ऐप के काम को करने के लिए बैकएंड पर सी ++ डीएलएल का उपयोग करने की आवश्यकता है, जो कि उपयोगकर्ता के ब्राउज़र के बीच बैठने के लिए आप किस तकनीकी ढेर की सिफारिश करेंगे और सी ++ डीएल हैं? हम मान सकते हैं कि वेब सर्वर विंडोज होगा।

कुछ विकल्प:

  1. खिड़कियों DLL जो तब नेट के माध्यम से पहुंच हो सकता है और से निर्यात DLL इंटरफ़ेस सीधे यूआई
  2. प्रवेश के लिए ASP.NET उपयोग कर सकते हैं के शीर्ष पर एक COM परत लिखें। नेट और यूआई के लिए एएसपी.नेट का उपयोग करें।
  3. एक कस्टम पायथन पुस्तकालय लिखें जो विंडोज़ डीएलएल को लपेटता है ताकि शेष कोड लिखा जा सके।
  4. सीजीआई लिखें सी ++ और एक सी ++ का उपयोग कर - Wt

चिंताएं तरह आधारित MVC ढांचा:

  • मैं नहीं बल्कि सी ++ वेब रूपरेखा के लिए उपयोग नहीं होता है, तो यह बचा जा सकता है - मैं भाषाओं लगता है जैसे कि पाइथन और सी # विकास के समय के मामले में बस अधिक शक्तिशाली और कुशल हैं।
  • मुझे चिंता है कि मेरे मिश्रण प्रबंधित और अप्रबंधित कोड .NET समाधानों में से एक के साथ मैं कई छोटी समस्याओं के लिए पूछ रहा हूं जो डीबग करना मुश्किल है (इसके लिए पूरी तरह से अचूक सबूत)
  • समान उपयोग करने के लिए भी सही है एक पायथन परत। जो कुछ भी पीटा पथ से थोड़ी दूर है, उसमें मुझे चिंता है कि मेरे पास एक सबूत नहीं है या दूसरा अगर यह व्यवहार्य दीर्घकालिक समाधान है।
+0

"वेब एप्लिकेशन" द्वारा मुझे लगता है कि फ्लैश या सिल्वरलाइट जैसे आरआईए के बजाय आपको HTML/CSS/जावास्क्रिप्ट का मतलब है? –

+0

मैं करता हूँ, हाँ। अंतिम ऐप में कुछ फ़्लैश/एसएल तत्व हो सकते हैं लेकिन उन्हें नींव नहीं होना चाहिए। – Karim

उत्तर

10

भी देखें Can a huge existing application be ported to the web? How?

क्षमा अच्छा नहीं समाधान, बस कम बुरे देखते हैं ....

सबसे पहले आप पहले से ही खिड़कियों मैं यह सोचते हैं कि आप का उपयोग करने के लिए उपयोग किया जाता है के लिए विकसित रूप में माइक्रोसॉफ्ट डेवलपमेंट टूल्स, मैं यूनिक्स (या मैक) से आने वाले डेस्कटॉप एप्लिकेशन के लिए एक ही जवाब नहीं दूंगा।

कुछ यादृच्छिक विचार और पॉइंटर्स।

  • मैं एएसपीनेट एमवीसी की सबसे अधिक संभावना Asp.net का उपयोग करूंगा।
  • मैं कुछ अच्छे उच्च स्तर .net कक्षा में सी ++ कक्षाओं में लपेटने की कोशिश करता हूं, शायद Managed C++/CLI का उपयोग कर रहा हूं।
  • COM का उपयोग सी ++ पक्ष पर बहुत अधिक काम होने की संभावना है और .NET को आसान नहीं बनाता है, इसलिए मैं प्रबंधित सी ++ या पिनवोक के पक्ष में COM से बचूंगा (हालांकि यदि आप पहले से ही C++ पक्ष पर COM का उपयोग कर रहे हैं , यह एक विकल्प है, बशर्ते आप COM के सबसेट का उपयोग कर रहे हों कि वीबी 6 का सामना करना पड़ सकता है)।
  • .NET किसी भी प्रबंधित सी ++ ऑब्जेक्ट तक नहीं पहुंच सकता है, लेकिन यह पिनवोक का उपयोग करके सरल सी फ़ंक्शन तक पहुंच सकता है, इसलिए आप जो भी कुछ भी ब्रिजिंग परत करते हैं उसे सी ++ साइट पर आवश्यक होगा।
  • देखें कि क्या आप वेब के बजाए सिल्वरलाइट का उपयोग कर सकते हैं, यदि आप (मुद्दों को स्थापित करने आदि) में सक्षम हैं तो यह आपको बहुत से विकास का समय बचाएगा। (और आपको माइक्रोसॉफ्ट फोन को भी लक्षित करने देता है)
  • जांचें कि "वेब पर पोर्ट" के लिए व्यावसायिक मामला बहुत मजबूत है और इसमें बहुत लंबा लगेगा तो आपको लगता है!, टर्मिनल सर्वर आदि के साथ होस्टिंग है के लिए आपके विकल्प?
  • थ्रेडिंग और बहु ​​उपयोगकर्ता पहुंच के बारे में सोचें, उदा। क्या आपका डीएल मानता है कि इसका उपयोग केवल एक उपयोगकर्ता द्वारा किया जा रहा है?
  • सिर्फ इसलिए कि आप एक नए वेब संस्करण पर काम कर रहे हैं, फिर भी आप वेब संस्करण भेजने के बाद भी डेस्कटॉप संस्करण में परिवर्तन की मांग करेंगे। मैंने अतीत में पाया है कि वर्तमान ग्राहक हमेशा एक वेब ऐप पर जाने की इच्छा नहीं रखते हैं।

(खेद है कि मैं अजगर के बारे में मैच पता नहीं है, लेकिन मैं कहूंगा कि आप पहले से ही उस में कौशल नहीं है, तो माइक्रोसॉफ्ट पर छड़ी ढेर के रूप में आप पहले से ही माइक्रोसॉफ्ट डिबगर आदि पता)


(मैं एक बहुत बड़ा दर्द के रूप में वेब के लिए जटिल अनुप्रयोगों पोर्टिंग के बारे में सोच है, यह सबसे अच्छा है जब संभव हो लेकिन कभी कभी आप कोई विकल्प दिया जाता है और सिर्फ करने के लिए है दर्द को कम दर्द से बचने के। तुम कभी नहीं है, तो प्रक्रिया में बड़े अनुप्रयोगों पर काम किया (आमतौर पर कई वर्षों डब्ल्यू ओर्क) को वेब पर पोर्ट किया जा रहा है, आप सिर्फ यह नहीं जानते कि आप अपने लिए क्या दे रहे हैं!)

+0

+1 "टर्मिनल सर्वर आदि के साथ होस्टिंग एक विकल्प है?" –

+0

अच्छे अंक। वेब ऐप पथ पर विचार किया जा रहा है क्योंकि 1) ग्राहकों के लिए आसान तैनाती 2) आसान उन्नयन 3) गुई परिवर्तनों के लिए तेज़ विकास चक्र। सिल्वरलाइट ऐसा कुछ नहीं है जिसे मैं विचार करना चाहता हूं - स्केची ब्राउज़र/प्लेटफार्म निर्भरताओं से बचने के लिए एक HTML/JS आधारित UI होना चाहिए। – Karim

+0

एचटीएमएल/जेएस आधारित यूआई का उपयोग स्केची ब्राउज़र निर्भरताओं को पाने का सबसे अच्छा तरीका है जो मुझे पता है। एक बहुत ही संतुलित उत्तर के लिए – rpg

2

मैं कहूंगा कि विकल्प 2 जाने का तरीका है। बशर्ते कि आप अपने डीएलएल में .NET में इंटरफ़ेस बना सकें ताकि यह सुनिश्चित किया जा सके कि जब आप आवश्यक हों तो आपको अपनी मेमोरी को सही ढंग से रिलीज़ करें। मुझे कोई समस्या नहीं दिखाई दे रही है। यदि आप अपने डीएलएल में अपने व्यावसायिक तर्क का पुन: उपयोग कर सकते हैं और मूल रूप से अपने डीएलएल में एक वेब कॉल कर सकते हैं तो महान।

मेरी एकमात्र चिंता आपकी डीएलएल की एपीआई होगी। एएसपी.Net स्पष्ट रूप से एक बहु उपयोगकर्ता बहु थ्रेडेड अनुप्रयोग है। क्या आपके एपीआई को इसे लेने के लिए डिज़ाइन किया गया है, बशर्ते कि अधिकांश विंडोज़ फॉर्म ऐप्स में केवल एक उपयोगकर्ता ही उन्हें चलाएगा (कल्पना करें कि आपके ऐप में प्रत्येक फॉर्म एक ही समय में एक से अधिक उपयोगकर्ता द्वारा खोला जा सकता है)।

4

3- पायथन समाधान है।

पायथन में एक सिग्नल एंट्री पॉइंट इंटरफ़ेस बनाएं जो केवल फ़ंक्शन का नाम लेता है और फ़ंक्शन को पास करने के लिए पैराम्स की एक सूची लेता है। आपके पास सीधे प्रयोग शुरू करने के लिए कुछ होगा और देखें कि पहले कार्यात्मक वेब प्रोटोटाइप के लिए डीएलएल के कौन से कार्यों की वास्तव में आवश्यकता है।

एक भी कार्य करता है मॉड्यूल के लिए एक ठूंठ

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

एक सेटअप के साथ संकलित किया जा सकता है।py फ़ाइल

from distutils.core import setup, Extension 

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

और तरह

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

धन्यवाद! यह बहुत अच्छी जानकारी है। काश मैं स्वीकार किए गए उत्तरों के रूप में दो चिह्नित कर सकते हैं :) – Karim

1

के बाद से कोई भी नहीं यह उल्लेख किया गया है, कैसे Wt के बारे में एक सरल वेब सर्वर में इस्तेमाल किया।

यदि आप एक एक्सप्लोरर-आधारित यूआई की तलाश नहीं कर रहे हैं, तो वेब-आधारित ऐप, POCO पर स्थानीय ऐप का विस्तार करने के लिए आपके लिए कई सी ++ लाइब्रेरी हैं। यदि आप विंडोज प्लेटफॉर्म पर चिपके हुए हैं, WWSAPI, सी/सी ++ डेवलपर्स के लिए वास्तव में अच्छा है।

संबंधित मुद्दे