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 を含む) があります。