5

C++ で書かれた成熟した Windows デスクトップ アプリケーションがあります。アプリケーションの GUI は、GUI のほとんどの作業を行う Windows DLL の上にあります (エンジンのようなものです)。これも C++ で書かれています。さまざまな理由から、Windows アプリを Web ベースのアプリに移行することを検討しています。

私が避けたいのは、この Web ベースのアプリの CGI を C++ で書かなければならないことです。つまり、このアプリの Web ベース バージョンを作成するために、Python や .NET 言語などの 4G 言語の機能が必要です。

質問は、アプリの作業を行うためにバックエンドで C++ DLL を使用する必要がある場合、ユーザーのブラウザーと C++ dll の間にあるテクノロジ スタックを推奨しますか? Web サーバーは Windows であると想定できます。

いくつかのオプション:

  1. Windows DLL の上に COM レイヤーを記述し、.NET 経由でアクセスして、UI に ASP.NET を使用できます。
  2. エクスポート DLL インターフェイスに .NET から直接アクセスし、UI に ASP.NET を使用します。
  3. 残りのコードを記述できるように、Windows DLL をラップするカスタム Python ライブラリを記述します。
  4. C++ とWtのような C++ ベースの MVC フレームワークを使用して CGI を記述します。

懸念:

  • 回避できるのであれば、Web フレームワークに C++ を使用したくありません。Python や C# などの言語は、開発時間の点で単純に強力で効率的だと思います。
  • マネージ コードとアンマネージ コードが .NET ソリューションの 1 つと混在していることを懸念しています。デバッグが難しい多くの小さな問題を求めています (純粋に事例証拠です)。
  • Python レイヤーを使用する場合も同様です。これが実行可能な長期的な解決策である場合、どちらにしても多くの証拠がないという点で、そのような人里離れた道から少し外れていることは心配です.
4

4 に答える 4

10

巨大な既存のアプリケーションを Web に移植できますか?も参照してください。どのように?

申し訳ありませんが、良い解決策はありません。悪い解決策はあまりありません....

まず、あなたは既に Windows 向けに開発しているので、Microsoft 開発ツールの使用に慣れていると仮定していますが、unix (または Mac) からのデスクトップ アプリケーションについては同じ答えにはなりません。

いくつかのランダムな考えと指針。

  • Asp.net を使用する可能性が最も高いのは、Aps.net MVC です。
  • おそらくManaged C++ / CLIを使用して、C++ クラスをいくつかの高レベルの .net クラスにラップしようとします。
  • COM を使用すると、C++ 側で多くの作業が必要になる可能性が高く、.NET を簡単にするわけではありません。そのため、マネージ C++ または pinvoke を優先して COM を避けます (ただし、既に C++ 側で COM を使用している場合は、これで十分です)。 VB6 が対応できる COM のサブセットを使用している場合は、オプションです)。
  • .NET はマネージされていない C++ オブジェクトにはアクセスできませんが、Pinvoke を使用して単純な C 関数にアクセスすることはできます。そのため、C++ サイトではなんらかのブリッジ レイヤーが必要になります。
  • Web ではなく Silverlight を使用できるかどうかを確認してください。(問題をインストールするなど) できる場合は、開発時間を大幅に節約できます。(そして、Microsoft Phone もターゲットにすることができます)
  • 「Web への移植」のビジネス ケースが非常に強力であり、予想よりもはるかに時間がかかることを確認してください。, ターミナル サーバーなどを使用したホスティングは、お客様のオプションですか?
  • スレッド化とマルチユーザー アクセスについて考えてみましょう。たとえば、dll は 1 人のユーザーだけが使用していると想定していますか?
  • 新しい Web バージョンに取り組んでいるという理由だけで、Web バージョンを出荷した後でも、顧客はデスクトップ バージョンへの変更を要求します。過去に、現在の顧客が常に Web アプリへの移行を望んでいるとは限らないことに気付きました。

(申し訳ありませんが、Python についての一致はわかりませんが、まだスキルがない場合は、Microsoft デバッガーなどを既に知っているので、Microsoft スタックに固執することをお勧めします)


(私は、複雑なアプリケーションを Web に移植することは非常に大きな苦痛だと考えています。可能な場合は苦痛を避けるのが最善ですが、オプションが与えられず、苦痛を最小限に抑える必要がある場合もあります。 Web に移植されるプロセス (通常は何年にもわたる作業です)。

于 2009-12-14T13:33:09.233 に答える
4

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

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()
于 2009-12-14T15:41:38.657 に答える
2

オプション2が進むべき道だと思います。.Net で DLL へのインターフェイスを作成して、必要に応じてメモリなどを正しく解放するようにすれば、問題は発生しません。DLL でビジネス ロジックを再利用し、基本的に DLL への Web 呼び出しを行うことができれば、すばらしいことです。

私の唯一の懸念は、DLL の API です。ASP.Net は明らかに複数ユーザーのマルチスレッド アプリケーションです。ほとんどの Windows フォーム アプリでは 1 人のユーザーしか操作できないため、API はこれを受け入れるように設計されていますか (アプリ内のすべてのフォームを複数のユーザーが同時に開くことができる場合を想像してください)。

于 2009-12-14T13:26:55.037 に答える
1

誰も言及していないので、 Wtはどうですか。

エクスプローラー ベースの UI を探していない場合は、ローカル アプリを Web ベースのアプリに拡張するための C++ ライブラリが多数あります。POCOはその 1 つです。Windows プラットフォームに固執している場合、WWSAPIは C/C++ 開発者にとって非常に優れています。

于 2009-12-18T03:39:59.697 に答える