一个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;
    }
 }

运行成功截图:

原文地址:https://www.cnblogs.com/mingzhao810/p/2882286.html