2009-12-14 5 views
5

Nous avons une application de bureau Windows mature écrite en C++. L'interface graphique de l'application se trouve au-dessus d'une DLL Windows qui fait la plupart du travail pour l'interface graphique (c'est en quelque sorte le moteur). C'est aussi écrit en C++. Nous envisageons de faire de l'application Windows une application Web pour diverses raisons.Transition d'une application de bureau écrite en C++ vers une application Web

Ce que je voudrais éviter est d'avoir à écrire le CGI pour cette application web en C++. Autrement dit, je préfère avoir la puissance d'un langage 4G comme Python ou un langage .NET pour créer la version web de cette application. Donc, la question est: étant donné que j'ai besoin d'utiliser une DLL C++ sur le backend pour faire le travail de l'application quelle pile de technologie recommanderiez-vous pour s'asseoir entre le navigateur de l'utilisateur et sont C++ dll? Nous pouvons supposer que le serveur web sera Windows.

Certaines options:

  1. Ecris une couche COM sur le dessus de la DLL de Windows qui peut alors être accès via .NET et utiliser ASP.NET pour l'interface utilisateur
  2. Accédez à l'interface DLL d'exportation directement à partir. NET et utiliser ASP.NET pour l'interface utilisateur.
  3. Ecrivez une bibliothèque Python personnalisée qui enveloppe la DLL Windows afin que le reste du code puisse être écrit.
  4. Écrivez le CGI en C++ et C++ - framework MVC base comme Wt

préoccupations:

  • Je préfère ne pas utiliser C++ pour le framework web si elle peut être évitée - Je pense langues comme Python et C# sont simplement plus puissants et efficaces en termes de temps de développement.
  • Je suis inquiet que mon mélange de code managé et non géré avec l'une des solutions .NET Je demande beaucoup de petits problèmes qui sont difficiles à déboguer (preuves purement anecdotiques pour cela)
  • Idem pour l'utilisation une couche Python. Tout ce qui est légèrement hors des sentiers battus comme ça m'inquiète parce que je n'ai pas beaucoup de preuves dans un sens ou dans l'autre si c'est une solution viable à long terme.
+0

Par "application web" je suppose que vous voulez dire HTML/CSS/Javascript, au lieu d'un RIA comme Flash ou Silverlight? –

+0

Je le fais, oui. L'application finale peut contenir des éléments flash/sl mais ils ne devraient pas être la base. – Karim

Répondre

10

Voir aussi Can a huge existing application be ported to the web? How?

Désolé, il n'y a pas de bonnes solutions, un peu moins mauvais ....

Tout d'abord que vous développez déjà pour Windows Je suppose que vous êtes habitué à utiliser les outils de développement Microsoft, je ne donnerais pas la même réponse pour une application de bureau qui vient d'unix (ou Mac).

Quelques pensées et pointeurs aléatoires.

  • Je voudrais faire usage de Asp.net le plus probable Aps.net MVC.
  • Je voudrais essayer d'envelopper dans les classes C++ dans une belle classe .net de haut niveau, peut-être en utilisant Managed C++/CLI.
  • L'utilisation de COM est susceptible d'être beaucoup de travail sur le côté C++ et ne rend pas le .NET facile, donc j'éviterais COM en faveur de C++ ou pinvoke géré (Cependant si vous utilisez déjà COM sur le côté C++ , ceci est une option, à condition que vous utilisiez le sous-ensemble de COM avec lequel VB6 pourrait faire face).
  • .NET ne peut accéder à aucun objet C++ géré, mais il peut accéder à la fonction C simple en utilisant Pinvoke, donc tout ce que vous faites une sorte de couche de pontage sera nécessaire sur le site C++. Voyez si vous pouvez utiliser Silverlight plutôt que le web, si vous êtes capable de (installer des problèmes etc), cela vous fera économiser beaucoup de temps de développement. (Et vous permet également de cibler les téléphones Microsoft)
  • Vérifiez que l'analyse de rentabilisation pour un «port sur le Web» est très forte et il faudra un beaucoup plus longtemps que vous ne le pensez!, Est l'hébergement avec le serveur terminal etc une option pour vos clients? Pensez à l'enfilage et à l'accès multi-utilisateur, par ex. Est-ce que votre dll suppose qu'il est seulement utilisé par un utilisateur? Tout simplement parce que vous travaillez sur une nouvelle version Web, vous demanderez toujours aux clients d'apporter des modifications à la version de bureau même après avoir expédié la version Web. J'ai trouvé dans le passé que les clients actuels ne souhaitent pas toujours passer à une application Web.

(Désolé, je ne sais pas correspondance sur Python, mais si vous ne l'avez pas déjà des compétences dans ce que je dirais bâton sur la pile Microsoft comme vous le savez débogueur Microsoft, etc)


(je pense que le portage des applications complexes sur le Web comme très grande douleur, il est préférable d'éviter la douleur lorsque cela est possible mais vous donne parfois pas d'autre choix et juste avoir à minimiser la douleur. Si vous avez jamais travaillé sur de grandes applications qui sont en cours (normalement de nombreuses années w ork) d'être porté sur le web, vous ne savez pas à quoi vous vous livrez!)

+0

+1 pour "L'hébergement avec le serveur terminal etc est-il une option?" –

+0

Bons points. Le chemin de l'application Web est envisagé car 1) un déploiement plus facile pour les clients 2) des mises à niveau plus faciles 3) des cycles de développement plus rapides pour les modifications de l'interface graphique. Silverlight n'est pas quelque chose que je veux considérer - devrait être une interface utilisateur HTML/JS pour éviter les dépendances de navigateur/plate-forme. – Karim

+0

L'utilisation d'interfaces utilisateur basées sur HTML/JS est le meilleur moyen d'obtenir des dépendances de navigateur fragmentaires que je connaisse. – rpg

2

Je dirais que l'option 2 est la voie à suivre. Pourvu que vous créiez une interface dans .Net à votre DLL pour vous assurer que vous libérez correctement votre mémoire etc. si nécessaire, je ne vois pas de problème. Si vous pouvez réutiliser votre logique métier dans votre DLL et faire un appel Web dans votre DLL, alors génial.

Ma seule préoccupation serait l'API de votre DLL. ASP.Net est évidemment une application multi-thread multi-utilisateur. Votre API a-t-elle été conçue pour répondre à ce problème, étant donné que la plupart des applications de formulaires Windows n'ont qu'un seul utilisateur (imaginez si tous les formulaires de votre application peuvent être ouverts simultanément par plus d'un utilisateur).

4

3- Python est la solution.

Créez une interface de point d'entrée unique en python qui ne prend que le nom de la fonction et une liste de paramètres à transmettre à la fonction elle-même. Vous aurez quelque chose à commencer à expérimenter tout de suite et à voir quelles fonctions de la DLL sont vraiment nécessaires pour le premier prototype web fonctionnel.

Un talon pour un seul module fonctions est

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

peut être compilé avec une configuration.fichier py

from distutils.core import setup, Extension 

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

et utilisé dans un simple serveur web comme

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

Merci! C'est une bonne information. Je voudrais pouvoir marquer deux réponses acceptées :) – Karim

1

Comme personne n'a mentionné, comment Wt au sujet.

Si vous ne recherchez pas une interface utilisateur basée sur un explorateur, il existe de nombreuses bibliothèques C++ pour étendre une application locale à une application Web, POCO en fait partie. Si vous vous en tenez à la plate-forme Windows, WWSAPI, c'est vraiment cool pour les développeurs C/C++.

Questions connexes