Переход из настольного приложения, записанного в C++ в веб-приложение

Да, за исключением .settings папки. Фиксация других файлов работает хорошо на нас. Существует подобный вопрос здесь .

5
задан Karim 14 December 2009 в 13:16
поделиться

4 ответа

См. также Может ли огромная существующая приложение будет перенесено в интернет? Как?

Извините, нет хороших решений, только менее плохие....

Во-первых, поскольку вы уже разрабатываете для windows, я предполагаю, что вы привыкли использовать средства разработки Microsoft, я бы не дал такого же ответа для настольного приложения, которое поставляется с unix (или Mac).

Некоторые случайные мысли и указатели.

  • Я бы использовал Asp.net, скорее всего, Aps.net MVC.
  • Я бы попробовал обернуть классы C++ в какой-нибудь хороший класс высокого уровня .net, возможно, используя Managed C++ / CLI.
  • Использование COM, скорее всего, будет большой работой на стороне C++ и не делает . NET, поэтому я бы избежал COM в пользу управляемого C++ или pinvoke (Однако, если вы уже используете COM на стороне C++, то это вариант, при условии, что вы используете подмножество COM, с которым может справиться VB6)
  • . NET не может получить доступ ни к одному управляемому объекту C++, но может получить доступ к простой функции C с помощью Pinvoke, так что, что бы вы ни делали, вам понадобится какой-нибудь мостиковый слой на сайте C++.
  • Посмотрите, можете ли вы использовать Silverlight вместо web, если вы можете (установить проблемы и т.д.), это сэкономит вам много времени на разработку. (И давайте также обратимся к Microsoft Phones)
  • Проверьте, что бизнес-порт для "порта в Интернет" очень силен и это займет намного больше времени, чем вы думаете!, Является ли хостинг с терминальным сервером и т.д. опцией для ваших клиентов?
  • Подумайте о многопоточном и многопользовательском доступе, например, предполагает ли ваша dll, что она используется только одним пользователем?
  • Только потому, что вы работаете над новой веб-версией, вы все равно получите клиентов, требующих изменения настольной версии, даже после того, как вы отправите веб-версию. В прошлом я обнаружил, что нынешние клиенты не всегда хотят переходить на веб-приложения.

(К сожалению, я не знаю совпадений с Python, однако, если у вас еще нет в нем навыков, я бы сказал, прилипнуть к стеку Microsoft, так как вы уже знаете отладчик Microsoft и т.д.)


(Я думаю о переносе сложных приложений в веб как о очень большой боли , лучше избегать боли, когда это возможно, однако иногда вам не дают возможности и просто нужно свести к минимуму боль . Если вы никогда не работали с большими приложениями, которые находятся в процессе (обычно много лет работы) переноса в web, вы просто не знаете, за что вы себя выдаете!)

10
ответ дан 18 December 2019 в 09:50
поделиться

3- Python - решение.

Сделайте Интерфейс точки входа sigle в Python, который принимает только имя функции и список параметров для передачи самой функции. Вам сразу будет с чем начать экспериментировать и посмотреть, какие функции 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);
}

может быть скомпилирована с помощью файла setup.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()
4
ответ дан 18 December 2019 в 09:50
поделиться

Я бы сказал, что вариант 2 - лучший вариант. При условии, что вы создаете интерфейс в .Net для своей DLL, чтобы убедиться, что вы правильно освобождаете свою память и т.д., когда это необходимо, я не вижу проблемы. Если вы можете повторно использовать бизнес-логику в своей DLL и в основном выполнять веб-вызовы в своей DLL, тогда отлично.

Меня беспокоит только API вашей DLL. Очевидно, что ASP.Net - это многопользовательское многопоточное приложение. Разработан ли ваш API для этого, учитывая, что в большинстве приложений Windows Forms им управляет только один пользователь (представьте, что каждая форма в вашем приложении может быть открыта более чем одним пользователем одновременно).

Если вы можете повторно использовать бизнес-логику в своей DLL и в основном выполнять веб-вызовы в своей DLL, тогда отлично.

Меня беспокоит только API вашей DLL. Очевидно, что ASP.Net - это многопользовательское многопоточное приложение. Разработан ли ваш API с учетом этого, учитывая, что в большинстве приложений Windows Forms им управляет только один пользователь (представьте, что каждая форма в вашем приложении может быть открыта более чем одним пользователем одновременно).

Если вы можете повторно использовать бизнес-логику в своей DLL и в основном выполнять веб-вызовы в своей DLL, тогда отлично.

Меня беспокоит только API вашей DLL. Очевидно, что ASP.Net - это многопользовательское многопоточное приложение. Разработан ли ваш API с учетом этого, учитывая, что в большинстве приложений Windows Forms им управляет только один пользователь (представьте, что каждая форма в вашем приложении может быть открыта более чем одним пользователем одновременно).

2
ответ дан 18 December 2019 в 09:50
поделиться

Поскольку никто не упомянул об этом, как насчет Wt .

Если вы не ищете пользовательский интерфейс на основе проводника, существует множество библиотек C ++ для расширения локального приложения до веб-приложения, POCO - одна из них. Если вы придерживаетесь платформы Windows, WWSAPI действительно хорош для разработчиков C / C ++.

1
ответ дан 18 December 2019 в 09:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: