2

クラスを含まないdllに明示的なリンクを使用する方法は知っていますが、クラスを含むdllをリンクする方法は次のとおりです。

class math{
public:
int sum(int,int);
};

それをロードするには:

    typedef int(*func)(int,int);
    int main{
    HINSTANCE hDLL;               // Handle to DLL
    hDLL = LoadLibrary("math.dll");
        func add=(func)GetProcAddress(hDLL, "sum");
    add(4,5);
 return 0;
    }

これを行うと、動作を停止してプログラムを終了し、クラスを削除すると動作します

4

2 に答える 2

2

C++ コンパイラは、名前マングリングを使用して、プログラム内の識別子を一意に区別します。このマングリングにより、名前は、プログラムで使用するプレーンな識別子とは大きく異なります。このためGetProcAddress、DLL 内に存在する C++ で記述されたコードにアクセスする場合、通常は実用的ではありません。代わりに__declspec(dllexport)、 andを使用__declspec(dllimport)して、DLL 内のコードに簡単にアクセスできるようにすることをお勧めします。

DLL のプロジェクトでは、"EXPORT_CLASSES" などの名前または DLL に固有のプリプロセッサ定義を追加する必要があります。これは、特定の宣言を DLL によってエクスポートする必要があるか、プログラムによってインポートする必要があるかを決定するために、DLL とプログラムによって使用されます。

dllstuff.h

#ifdef EXPORT_CLASSES
#define IMPORT_EXPORT __declspec(dllexport)
#else
#define IMPORT_EXPORT __declspec(dllimport)
#endif

次に、これを使用するためのクラス宣言を変更mathします。DLL がコンパイルされると、IMPORT_EXPORT は等しくなり__declspec(dllexport)、このクラスの定義を公開する必要があることをコンパイラとリンカーに指示します (つまり、DLL のエクスポート テーブルを介して)。

mathclass.h

#include "dllstuff.h"

class IMPORT_EXPORT math
{
public:
    int sum(int, int);
};

mathclass.hこれで、メイン アプリケーションで行う必要があるのは、数学クラスを使用したいときにいつでもインクルードすることだけです。のインスタンスをインスタンス化し、そのmathメンバー関数にアクセスできるようになりました。

#include "mathclass.h"
int main()
{
    math m;
    int result = m.sum(1, 2);
}

もちろん、これはプロセスの基本的な説明にすぎません。Web には、より詳細な情報を提供する多くの記事 (SO を含む) があります。

于 2013-07-02T20:14:08.560 に答える