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

    运行成功截图:

  • 相关阅读:
    vue生命周期过程做了什么
    css_css3_实用属性_随时补充更新
    echarts的symbol引用本地图片写法
    无废话设计模式(1)--简单工厂、工厂方法、抽象工厂
    JavaWeb--Maven学习
    SpringCloud Alibaba实战 -引入服务网关Gateway
    从ReentrantLock看AQS (AbstractQueuedSynchronizer) 运行流程 抽象的队列式同步器
    架构的搭建(一)SpringCloud Alibaba
    配置中心之Nacos简介,使用及Go简单集成
    RabbitMQ
  • 原文地址:https://www.cnblogs.com/mingzhao810/p/2882286.html
Copyright © 2011-2022 走看看