(转)Balon白话MSDN:从普通DLL中导出C++类(1) – dllexport和dllimport的使用方法(中英对照、附注解)
转于:http://blog.csdn.net/balonfan/archive/2007/05/09/1602294.aspx Balon白话MSDN:从普通DLL中导出C++类(1) – dllexport和dllimport的使用方法(中英对照、附注解)
这几天写几个小程序练手,在准备将一个类导出时,发现还真不知道如果不用MFC的扩展DLL,是怎么导出的。但我知道dllexport可以导出函数和变量,而且MFC扩展DLL就算是使用了MFC的功能,但能否导出类应该也不是必须用MFC才能够做到,一定是有相应的机制可以实现。于是查了一下MSDN,发现这个机制简单的可怕,原来就和导出函数一样,把dllexport关键字加到类名前就可以了。估计和我一样的同学大有人在,把MSDN的相关文档翻译出来,附上我的注解,希望对大家有用。
评注程序均在Visual Studio.NET 2005 Professional中测试以得到结果,给出的代码均省略了大量语句,只保留了与主题最相关的部分,因此可能无法编译。
MSDN文档选自2007年4月更新的MSDN Library。
Using dllimport and dllexport in C++ Classes
在C++类中使用dllimport和dllexport
Microsoft Specific
You can declare C++ classes with the dllimport or dllexport attribute. These forms imply that the entire class is imported or exported. Classes exported this way are called exportable classes.
The following example defines an exportable class. All its member functions and static data are exported:
可以在声明C++类时使用dllimport和dllexport属性。这两个形式将隐含导入或导入整个类。通过这种方法导出的类称为可导出类。
下列范例定义了一个可导出类,其所有的成员函数和静态将被导出:
#define
DllExport __declspec( dllexport )
class DllExport C { int i; virtual int func( void ) { return 1 ; } };
Note that explicit use of the
dllimport and
dllexport attributes on members of an exportable class is prohibited.
注意,禁止在一个可导出类的成员上显式的使用dllimport和dllexport属性。
通过dllexport导出类
When you declare a class dllexport, all its member functions and static data members are exported. You must provide the definitions of all such members in the same program. Otherwise, a linker error is generated. The one exception to this rule applies to pure virtual functions, for which you need not provide explicit definitions. However, because a destructor for an abstract class is always called by the destructor for the base class, pure virtual destructors must always provide a definition. Note that these rules are the same for nonexportable classes.
If you export data of class type or functions that return classes, be sure to export the class.
当你声明一个类为dllexport,其所有的成员函数和静态数据成员将被导出。你必须在同一个程序中定义所有此类成员,否则会产生一个链接错误。
这个规则的唯一例外是对纯虚函数你可以不用提供显示的定义。
但是,由于抽象类的析构函数总是会被基类的析构函数调用的,因此纯虚析构函数必须提供一个定义。这条规则对于不可导出的类同样适用。
如果你导出一个类类型的数据成员,或是一个返回类的函数,请确保导出那个类。
dllimport Classes
通过dllimport导入类
When you declare a class dllimport, all its member functions and static data members are imported. Unlike the behavior of dllimport and dllexport on nonclass types, static data members cannot specify a definition in the same program in which a dllimport class is defined.
当你将一个类声明为dllimport,其所有的成员函数和静态数据成员将被导入。与在非类类型上使用dllimport和dllexport不同的是,不能在有dllimport类的定义的同一个程序中指给出静态数据成员的定义。
|