一个VC中的DLL导出类的例子
思路:
a 把需要用到的接口写入到一个虚基类中;
b 需要导出的类从此虚基类中派生;
c 写一个全局函数,在此函数中创建导出类,然后返回类指针,然后将此全局函数导出。
实现:
dll项目中包含文件:basevirtualstruct.h,myclass.h,myclass.cpp等3个文件。3个文件列表内容如下:
//文件basevirtualstruct.h
struct basevirtualstruct
{
virtual float add(float a,float b)=0;
};
//文件myclass.h
#include "basevirtualstruct.h"
class Myclass: public basevirtualstruct
{
public:
Myclass(void);
public:
~Myclass(void);
public:
float add(float a,float b);
};
//Myclass.cpp
#include "Myclass.h"
Myclass::Myclass(void)
{
}
Myclass::~Myclass(void)
{
}
int Myclass::add(float a,float b)
{
return a+b;
}
extern "C" __declspec basevirtualstruct* createMyclass()
{
return new Myclass();
}
完成上述代码后,编译,将产生的dll文件,以及两个头文件拷贝到要使用的工程目录下,然后在工程中做如下修改:
头文件中添加:
#include "basevirtualstruct.h"
typedef basevirtualstruct * (* LPFUNC)();
实现文件中添加:
HINSTANCE hDLL = LoadLibrary(_T("dll文件名不带后缀"));
if (hDLL != NULL)
{
TRACE(_T("加载DLL文件成功!"));
LPFUNC lpFunc = (LPFUNC)GetProcAddress(hDLL, "createMyclass");
if (!lpFunc)
{
FreeLibrary(hDLL);
TRACE(_T("获取函数地址失败!"));
return;
}
else
{
TRACE(_T("获取函数地址成功!"));
basevirtualstruct* bvs= lpFunc();
CString str;
str.Format(_T(%f"), bvs->add(5,25));
TRACE(str);
FreeLibrary(hDLL);
return;
}
}
运行成功截图: