以下を含むDLLを作成しようとしました。
基本テンプレートクラス、仮想デストラクタのみを含み、属性はありません(私はこれをMatrixInterfaceと呼びました)
コンストラクタ、デストラクタ、operator =および属性を持つ派生クラス(行列クラス)
新しい派生オブジェクトへの基本クラスポインタを返す関数:
#ifdef BUILD_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif
template<class T>
MatrixInterface<T> DLL_EXPORT * CreateMatrixInstance(unsigned int n,unsigned int m)
{
return new matrix<T>(n,m);
}
この関数を使用してプログラムの行列クラスをインスタンス化したかったのですが、この関数に関数ポインターを割り当てることができず、その理由がわかりません。この方法で、テンプレート関数ではない関数をロードできます。
#include <windows.h>
#include <iostream>
using namespace std;
template<class T>
class MatrixInterface
{
public:
virtual ~MatrixInterface(void);
};
typedef MatrixInterface<int>* (*Fptr)(unsigned int,unsigned int);
int main(int argc, char* argv[])
{
Fptr p;
MatrixInterface<int> *x;
char path[]="basicmatrix.dll";
HINSTANCE hDll = LoadLibrary(path);
cout<<(char*)path<<endl;
if(hDll)
{
cout<<"Library opened succesfully!"<<endl;
p = (Fptr)GetProcAddress(hDll,"CreateMatrixInstance");
if(p) {
cout<<"working!\n";
x=p(7,8);
cout<<"MatrixCreated"<<endl;
delete x;
} else {
cout<<"Failed loading function CreateMatrixInstance\n";
}
}
else
{
cout<<"Failed loading library "<<(char*)path<<endl;
}
system("pause");
FreeLibrary(hDll);
return 0;
}
基本クラスは、DLLと実行可能ファイルの両方に存在します。
何らかの理由で、Visual StudioはDLL(MSVCまたはMinGWでコンパイルされた)を開くことができません。MinGWでプログラムをコンパイルすると、.dllファイルが読み込まれます。
私のコードの何が問題になっているのか教えていただけますか?