C++ 类中使用dllimport和dllexport
在Windows平台下:
您可以使用dllimport或dllexport属性声明C ++类。这些形式意味着导入或导出整个类。以这种方式导出的类称为可导出类。
以下示例定义可导出的类。导出其所有成员函数和静态数据:
#define DllExport __declspec( dllexport ) class DllExport C
{
int i;
virtual int func( void ) { return ; }
};
请注意,禁止在可导出类的成员上显式使用 dllimport 和 dllexport 属性。
dllexport类
声明类dllexport时,将导出其所有成员函数和静态数据成员。您必须在同一程序中提供所有此类成员的定义。否则,将生成链接器错误。此规则的一个例外适用于纯虚函数,您无需为其提供显式定义。但是,因为抽象类的析构函数总是由基类的析构函数调用,所以纯虚拟析构函数必须始终提供定义。请注意,这些规则对于不可导出的类是相同的。
如果导出类类型的数据或返回类的函数,请确保导出该类。
dllimport类
声明类dllimport时,将导入其所有成员函数和静态数据成员。与dllimport和dllexport在非类类型上的行为不同,静态数据成员不能在定义dllimport类的同一程序中指定定义。
继承和可导出的类
可导出类的所有基类都必须是可导出的。如果不是,则生成编译器警告。此外,所有可访问的成员也必须是可导出的。该规则允许DLLEXPORT类从继承dllimport的类和dllimport的类从继承DLLEXPORT类(但不建议后者)。通常,DLL调用者可访问的所有内容(根据C ++访问规则)应该是可导出接口的一部分。这包括内联函数中引用的私有数据成员。
选择成员导入/导出
由于类中的成员函数和静态数据隐式具有外部链接,因此可以使用dllimport或dllexport属性声明它们,除非导出整个类。如果导入或导出整个类,则禁止将成员函数和数据显式声明为dllimport或dllexport。如果将类定义中的静态数据成员声明为dllexport,则定义必须出现在同一程序中的某个位置(与非类外部链接一样)。
同样,您可以使用dllimport或dllexport属性声明成员函数。在这种情况下,您必须在同一程序中的某处提供dllexport定义。
值得注意的是有关选择性成员导入和导出的几个要点:
选择性成员导入/导出最适用于提供限制性更强的导出类接口的版本; 也就是说,您可以设计一个DLL,该DLL暴露的公共和私有功能比该语言允许的更少。它对于微调可导出接口也很有用:当您知道调用者(根据定义)无法访问某些私有数据时,您无需导出整个类。
如果在类中导出一个虚函数,则必须导出所有虚函数,或者至少提供调用者可以直接使用的版本。
如果您有一个使用虚拟函数选择性成员导入/导出的类,则这些函数必须位于可导出接口中或内联定义(对客户端可见)。
如果将成员定义为dllexport但未将其包含在类定义中,则会生成编译器错误。您必须在类标头中定义该成员。
虽然允许将类成员定义为dllimport或dllexport,但是不能覆盖类定义中指定的接口。
如果在声明它的类定义主体之外的位置定义成员函数,则在函数定义为dllexport或dllimport时生成警告(如果此定义与类声明中指定的定义不同)。
C++ 类中使用dllimport和dllexport的更多相关文章
- 在C++类中使用dllimport和dllexport导出,
在Windows平台下: 您可以使用dllimport或dllexport属性声明C ++类.这些形式意味着导入或导出整个类.以这种方式导出的类称为可导出类. 以下示例定义可导出的类.导出其所有成员函 ...
- DLL导出函数和类的定义区别 __declspec(dllexport)
DLL导出函数和类的定义区别 __declspec(dllexport) 是有区别的, 请看 : //定义头文件的使用方,是导出还是导入 #if defined(_DLL_API) #ifndef D ...
- 动态链接库(dll) __declspec(dllimport) __declspec(dllexport)
一. __declspec(dllexport) Microsoft 在 Visual C++ 的 16 位编译器版本中引入了 __export,使编译器得以自动生成导出名并将它们放到一个 .lib ...
- C#中的DllImport
大家在实际工作学习C#的时候,可能会问:为什么我们要为一些已经存在的功能(比如 Windows中的一些功能,C++中已经编写好的一些方法)要重新编写代码,C#有没有方法可以直接都用这些原本已经存在的功 ...
- VS下 dllimport与dllexport作用与区别
我相信写WIN32程序的人,做过DLL,都会很清楚__declspec(dllexport)的作用,它就是为了省掉在DEF文件中手工定义导出哪些函数的一个方法.当然,如果你的DLL里全是C++的类的话 ...
- dllimport与dllexport作用与区别
我相信写WIN32程序的人,做过DLL,都会很清楚__declspec(dllexport)的作用,它就是为了省掉在DEF文件中手工定义导出哪些函数的一个方法.当然,如果你的DLL里全是C++的类的话 ...
- C#(.net)中的DllImport
大家在实际工作学习C#的时候,可能会问:为什么我们要为一些已经存在的功能(比如Windows中的一些功能,C++中已经编写好的一些方法)要重新编写代码,C#有没有方法可以直接都用这些原本已经存在的功能 ...
- C#中的DllImport使用方法
DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出的函数的必要调用信息 DllImport属性应用于方法,要求最少要 ...
- 泛型方法或泛型类中的方法是内部调用、PInvoke 或是在 COM 导入类中定义的。
泛型基类中引用Api函数定义时static extern,在子类中会提示: 未处理TypeLoadException 泛型方法或泛型类中的方法是内部调用.PInvoke 或是在 COM 导入类中定义的 ...
随机推荐
- POJ 1094:Sorting It All Out拓扑排序之我在这里挖了一个大大的坑
Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 29984 Accepted: 10 ...
- ..\OBJ\LED.axf: Error: L6218E: Undefined symbol EXTI_Init (referred from exti.o). 错误修改
今天在移植野火的程序到元子的开发平台上时候,发现自己在中断初话中断函数的时候出现了:..\OBJ\LED.axf: Error: L6218E: Undefined symbol EXTI_Init ...
- 进度2_家庭记账本App
今天在昨天的基础上,相继完成了三个页面的布局和显示情况: 新增加的xml文件如下: activity_add.xml: <?xml version="1.0" encodin ...
- oracle(9) 序列和约束
序列 SEQUENCE 也是数据库对象之一,作用:根据指定的规则生成一些列数字. 序列通常是为某张表的主键提供值使用. 主键:通常每张表都会有主键字段,该字段的值要求非空且唯一, 使用该字段来确定表中 ...
- 和为S的连续正序列
[问题]小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他就 ...
- chown virtualbox
virtualbox安装 root@cbill-VirtualBox:/# chown --help用法:chown [选项]... [所有者][:[组]] 文件... 或:chown [选项]... ...
- centos6-7 yum安装php的方法
1.检查当前安装的PHP包 yum list installed | grep php 如果有安装的PHP包,先删除他们 yum remove php.x86_64 php-cli.x86_64 ph ...
- ubuntu root用户下找不到环境变量解决办法
打开 gedit /root/.bashrc ,在文件的末尾添加: source /etc/profile 然后执行更新:source /root/.bashrc
- Linux 文件上传
Linux 文件上传操作 SecureCRT与linux互相上传和下载文件 1. 需要上传或者下载,需要使用rz和sz命令. 2. 如果linux上没有这两个命令工具,则需要先安装.可以使用yum安装 ...
- Maven - No plugin found for prefix 'tomcat7' in the current project
问题发现: 在构建Maven项目的时候,出现了No plugin found for prefix 'tomcat7' in the current project的错误. 是需要在Maven的Pom ...