zoukankan      html  css  js  c++  java
  • 一个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;
        }
     }

    运行成功截图:

  • 相关阅读:
    线程池:
    C#:实现托盘
    Linux内核 TCP/IP、Socket参数调优
    redis配置文件redis.conf参数说明
    redis安装与参数说明
    巧用linux服务器的/dev/shm/,如果合理使用,可以避开磁盘IO不给力,提高网站访问速度。
    mkdir:批量创建文件夹
    linux下的shell运算(加、减、乘、除)
    Linux查看文件编码格式及文件编码转换
    解决vi/vim中粘贴会在行首多很多缩进和空格的问题
  • 原文地址:https://www.cnblogs.com/mingzhao810/p/2882286.html
Copyright © 2011-2022 走看看