精华内容
下载资源
问答
  • DLL导出类的三种方法,导出接口类,导出类指针,导出类,不建议使用导出类
  • idea 导出类

    千次阅读 2019-05-07 10:37:31
    选中要导出类图的文件 右键

    选中要导出类图的文件 右键

     

    展开全文
  • C++ DLL 导出类 示例

    2015-08-06 21:47:15
    一个简单的C++生成DLL(导出类),然后用控制台程序去调用它的示例,可以帮助你理解如何从DLL中导出类,并使用该类。 该项使用VS2010编译,低版本可能无法打开。
  • C++ DLL导出类

    2019-06-26 17:22:55
    C++ DLL导出类 http://www.voidcn.com/article/p-drfrizft-vs.html
    展开全文
  • 静态连接库与导出函数、导出类
    展开全文
  • MFC扩展DLL导出类

    热门讨论 2011-05-28 09:19:58
    MFC扩展DLL导出类 一步一步实现MFC导出类和对话框的例子
  • VC++导入导出类

    2016-12-14 08:57:04
    一、导出类 VC++中导出类很简单,下面列出了两个等价的方法: 方法1: class __declspec(dllexport) CTest { public: int m_nValue; CObj m_obj; }; 方法2: class __declspec(dllexport) CTest; //...

    一、导出类

    VC++中导出类很简单,下面列出了两个等价的方法:

    方法1:

    class __declspec(dllexport) CTest

    {

    public:

    int        m_nValue;

    CObj    m_obj;

    };

    方法2:

    class __declspec(dllexport) CTest;        //类声明,说明是一个导出类

    class CTest

    {

    public:

    int        m_nValue;

    CObj    m_obj;

    };

    注意:方法2的类声明必须放在 class CTest 的前面,最好放在预编译头文件 StdAfx.h 里。

    使用方法1比较麻烦,要导出一个类还得修改类定义;方法2就比较方便了,可以将要导出的类声明集中放在 StdAfx.h 里,方便维护。

    需要注意以下几个问题:

    1、成员对象所属类也需要被导出

    m_obj是CTest的成员对象,它所属的类CObj也需要被导出。否则编译的时候会产生警告,客户程序可能无法正常构造CTest类(Debug版正常,Release版分配内存但不调用构造函数)。如果导出CObj比较困难,如它是一个模板类,则应该将CObj m_obj更改为CObj*m_obj;

    2、内联成员函数

    内联函数相当于宏,编译的时候用来替换源代码,用以提高效率。一般它是不会被编译成目标代码的,但是一旦使用了__declspec(dllexport),编译程序将会为其生成一份目标代码,客户程序调用内联成员函数时,可能直接调用目标代码,此时函数将不再是内联的了。当然,导入类时也可以控制客户程序,使其使用内联的成员函数。

    3、友元函数

    需要注意的是,上述两个方法均不能导出类的友元函数。要导出友元函数,必须专门声明。方法1、2的改进方案为:

    方法1:

    class __declspec(dllexport) CTest

    {

    public:

    int m_nValue;

    public:

    //导出友元函数要专门声明

    friend __declspec(dllexport) CTest operator+(const CTest&a,const CTest&b);

    };

    方法2:

    class __declspec(dllexport) CTest;

    //导出友元函数要专门声明

    __declspec(dllexport) CTest operator+(const CTest&a,const CTest&b);

    class CTest

    {

    public:

    int m_nValue;

    public:

    friend CTest operator+(const CTest&a,const CTest&b);

    };

    4、嵌套类

    要导出嵌套类,方法1的改进方案为:

    class __declspec(dllexport) CTest

    {

    public:

    class __declspec(dllexport) CNest    //前面也要使用__declspec(dllexport)

    {

    }

    };

    方法2无法导出嵌套类,因为不能按下面的语法进行嵌套类声明:

    class __declspec(dllexport) CTest::CNest;    //这样声明是错误的

    此时,解决方案可能只有使用DEF文件了。

    二、使用DEF文件导出类

    按下图设置,使得编译时生成map文件。

    编译如下代码

    class __declspec(dllexport) CTest

    {

    public:

    void        SetValue(int v)        {m_Value = v;}

    int            GetValue();

    private:

    int            m_Value;

    public:

    static int    s_nValue;

    };

    int CTest::s_nValue = 1;

    int CTest::GetValue()                {return m_Value;}

    查看 map 文件,提取包含 CTest 的函数或变量:

    Address 

    Publics by Value 

    Rva+Base 

    Lib:Object 

    0001:00000030

    ?SetValue@CTest@@QAEXH@Z 

    10001030 f i 

    tDLL.obj 

    0001:00000070 

    ??4CTest@@QAEAAV0@ABV0@@Z 

    10001070 f i 

    tDLL.obj 

    0001:000000b0 

    ?GetValue@CTest@@QAEHXZ 

    100010b0 f 

    tDLL.obj 

    0003:00000a30 

    ?s_nValue@CTest@@2HA 

    1002ba30 

    tDLL.obj 

    注意上表的第三列,f表示函数,i表示内联。如果将 class __declspec(dllexport) CTest 中的 __declspec(dllexport) 去掉,重新编译,则上表第三列包含 f i 的在map文件中不会再出现。

    内联函数没有目标代码,所以无法通过 DEF 导出。只能通过DEF文件导出非内联的成员函数,如:下面的DEF文件内容导出了CTest::GetValue函数。

    EXPORTS

    ?GetValue@CTest@@QAEHXZ

    ?s_nValue@CTest@@2HA对应着CTest::s_nValue,它应该被导出,但是使用DEF导出变量需要注意:客户程序导入该变量时,只能导入该变量的地址。

    三、导入类

    导出类到动态链接库的同时,就生成了库文件(*.lib)。VC++很智能,客户程序包含这个库文件即可完成类的导入。要特别注意这种导入的内联成员函数。下面的代码中,客户程序调用内联成员函数GetValue时,将不会使用导出类的GetValue目标代码,而是使用类声明中的代码。此时,GetValue还是内联函数。

    class CTest

    {

    public:

    int m_nValue;

    public:

    int GetValue()

    {

    return m_nValue;

    }

    };

    如果不想客户程序使用类声明中的代码,有两种方法:

    1、删除内联函数GetValue的实现代码,仅仅保留函数声明;

    2、使用__declspec(dllimport),如下所示:

    class __declspec(dllimport) CTest

    {

    public:

    int m_nValue;

    public:

    int GetValue()

    {

    return m_nValue;

    }

    };

    或在 StdAfx.h 中,增加class __declspec(dllimport) CTest;这句类声明。使用__declspec(dllimport)声明类之后,友元函数就不再需要__declspec(dllimport)声明了。

    四、总结

    1、导出类有两种方法,一种是使用 __declspec(dllexport);另一种方法是使用DEF文件,该方法不能导出内联函数,导出类的静态成员变量也较为不便;

    2、友元函数不属于类,要导出的话必须使用 __declspec(dllexport) 声明,或在 DEF 文件中导出;

    3、导入类可以使用 __declspec(dllimport),也可以不使用。前者将取消内联成员函数的内联性质,后者不会;

    应用实例:

    下面是类CTest的定义部分,在 Test.h 里

    class CTest

    {

    public:

    class CNest

    {

    public:

    void SetValue(int v);

    int GetValue();

    friend CNest operator+(const CNest&a,const CNest&b);

    private:

    int m_nValue;

    };

    public:

    void SetValue(int v);

    int GetValue();

    friend CTest operator+(const CTest&a,const CTest&b);

    private:

    int m_nValue;

    public:

    static int s_nValue;

    };

    下面是类CTest的实现部分,在Test.cpp里

    //CTest-------------------------------------------------------------------------

    int CTest::s_nValue = 1;

     

    void CTest::SetValue(int v)

    {

    m_nValue = v;

    }

     

    int CTest::GetValue()

    {

    return m_nValue;

    }

     

    CTest operator+(const CTest&a,const CTest&b)

    {

    CTest c;

    c.m_nValue = a.m_nValue + b.m_nValue;

    return c;

    }

     

    //CTest::CNest------------------------------------------------------------------

    void CTest::CNest::SetValue(int v)

    {

    m_nValue = v;

    }

     

    int CTest::CNest::GetValue()

    {

    return m_nValue;

    }

     

    CTest::CNest operator+(const CTest::CNest&a,const CTest::CNest&b)

    {

    CTest::CNest c;

    c.m_nValue = a.m_nValue + b.m_nValue;

    return c;

    }

    导出 CTest 类及其友元函数,只需在 StdAfx.h 里增加如下代码:

    class __declspec(dllexport) CTest;

    __declspec(dllexport) CTest operator+(const CTest&a,const CTest&b);

    导出CTest::CNest的成员函数稍微麻烦些,需要在DEF文件中导出:

    EXPORTS

    ?SetValue@CNest@CTest@@QAEXH@Z

    ?GetValue@CNest@CTest@@QAEHXZ

    ??H@YA?AVCNest@CTest@@ABV01@0@Z

    客户程序导入CTest类,只需在 StdAfx.h 里增加如下代码:

    class __declspec(dllimport) CTest;

    //有了上面的声明,CTest的友元函数就不再需要特别声明了

    //下面这句话反而会引起警告

    __declspec(dllimport) CTest operator+(const CTest&a,const CTest&b);

    客户程序对 CTest::CNest 的导入无需特别声明,VC++编译器能够自动完成。但是,它对CNest是有限制的,即不能有静态成员变量。如果有,最好的办法就是不要使用嵌套了。

     

    展开全文
  • 导出类的简单方式

    2018-08-22 14:27:45
    只需要在导出类加上__declspec(dllexport),就可以实现导出类。对象空间还是在使用者的模块里,dll只提供类中的函数代码。不足的地方是:使用者需要知道整个类的实现,包括基类、类中成员对象,也就...
  • DLL 导出类

    2013-08-14 17:15:17
    http://www.cnblogs.com/cswuyg/archive/2011/10/06/DLL2.html 编写DLL所学所思(2)——导出类 http://www.cppblog.com/suiaiguo/archive/2009/07/20/90663.html DLL入门浅析(4)——从DLL中导出类
  • 动态链接库_导出类

    热门讨论 2013-05-30 16:34:13
    本人经过两天的研究,终于掌握了动态链接库的使用方法,动态链接库的使用上并不难,难在动态链接库中的导出类, 把dll中类的成员函数导出来才是最重要的,我就用几个例子介绍一下几种导出的方法: 第一种: 这种方法...
  • 2、导出派生中的函数; 3、通过采用模块定义(.def)文件声明,规范函数导出的名称。导出的函数,有些编译器会自动更改名字,增加很多限定符号,可以通过def文件规范化。 创建一个基类:base class base { public...
  • c++动态库导出类方法:

    千次阅读 2019-09-04 11:06:39
    导出类的本质是导出类里面的函数,因为语法上直接导出了类,没有对函数的调用方式和重命名进行设置,导致了dll并不通用。 //导出C++类 class _declspec(dllexport) Stu { public: Stu(int...
  • C++ 从Dll中导出类

    千次阅读 2017-11-06 14:38:21
    从Dll中导出类
  • React使用export导出类

    万次阅读 2017-08-08 21:57:12
    React中使用export导出类可以有两种方法1. export default classname 这种导出方式与export default class classname extends React.class相同在其他文件中引用时采取如下方式import classname form path例如:...
  • dll之导出类

    2014-08-11 22:33:46
    dll导出类两种方式: 1,.普通
  • dll导出类

    千次阅读 2012-09-11 11:02:20
    说明 功能赞助:ctrl+c 然后再ctrl+v ...关于导出类 (DLL) 资源中有Demo    要输出整个的类,对类使用_declspec(_dllexpot);要输出类的成员函数,则对该函数使用_declspec(_dllexport)。如:     class
  • VC动态库导出类调用

    热门讨论 2010-08-03 10:44:22
    VC动态库如何导出的例子; VC导出类如何在VC中调用。
  • dll导出类比较好的方式

    千次阅读 2018-03-20 16:56:15
    看了篇好文,dll导出类的,之前已经胡乱写,以后可以参考这个规范 前言/引用 转自:编写DLL所学所思(2)——导出类 参考:HowTo: Export C++ classes from a DLL 这种方式是比较合适的,跟com类似。结构是这样的: ...
  • 导出类的注意事项

    2016-06-17 10:01:49
    导出类的时候,基类也要导出来。
  • 在公司使用C++ 做开发,公司的大拿搭了一个...有一个问题让我有点困惑,普通的导入导出C++类的方式都是使用_declspec(dllexport) /_declspec(dllimport)来导入导出类,但是在公司的开发中我们没有导入导出,而是定义...
  • 从DLL中导出类

    2015-10-07 23:03:04
    从DLL中导出类  前面介绍了怎么从DLL中导出函数和变量,实际上导出类的方法也是大同小异,废话就不多说了,下面给个简单例子示范一下,也就不多做解释了。 DLL头文件: #ifndef _DLL_SAMPLE_H #define _...
  • DLL中导出类的成熟方法

    千次阅读 2019-06-17 19:00:05
    最近研究在DLL中导出类,探寻最佳的DLL导出类的方法和技术。把整个过程记录一下,防止遗忘。 基础知识 动态链接库 动态链接库(英语:Dynamic-link library,缩写为DLL)是微软公司在微软视窗操作系统中实现共享...
  • DLL导出类的问题

    2013-12-14 00:27:14
    DLL动态链接库是程序复用的重要方式,DLL可以导出函数,使函数被多个程序...然而事实却没这么简单,导出类的DLL在维护和修改时有很多地方必需很小心,增加成员变量、修改导出类的基类等操作都可能导致意想不到的后果
  • 一、导出类的简单方式

    千次阅读 2016-06-24 17:04:19
    一、导出类的简单方式 这种方式是比较简单的,同时也是不建议采用的不合适方式。 只需要在导出类加上__declspec(dllexport),就可以实现导出类。对象空间还是在使用者的模块里,dll只提供类中的函数代码。不足的地方...
  • DLL导出类

    2008-07-15 13:54:00
    DLL导出类DLL中定义的类可以在应用工程中使用。下面的例子里,我们在DLL中定义了point和circle两个类,并在应用工程中引用了它们(单击此处下载本工程附件)。//文件名:point.h,point类的声明#ifndef POINT_H#...
  • java文件导入导出类——easypoi注意一点 SpringBoot集成EsayPoi(Excel导入导出) easypoi 一行代码搞定excel导入导出 注意一点 public static void exportExcel(List<?> list, String title, ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,783
精华内容 9,113
关键字:

导出类