使用dllimport和dllexport在C++选件类

Microsoft 专用

可以声明与 dllimport 或 dllexport 属性的 C++ 类。 这些窗体提示导入整个类或导出。 类导出了这样的调用可导出类。

下面的示例定义可导出类。 所有其成员函数和静态数据导出:

#define DllExport   __declspec( dllexport )

class DllExport C {
   int i;
   virtual int func( void ) { return 1; }
};

注意显式请使用 dllimport ,并在可导出类成员的 dllexport 特性禁止。

dllexport 类

在声明类 dllexport时,所有其成员函数和静态数据成员导出。 您必须提供所有此类成员的定义同一程序的。 否则,链接器错误。 此规则的例外情况适用于纯虚函数,则无需提供显式定义。 但是,在中,因为抽象类的析构函数由基类的析构函数始终调用,纯虚析构函数必须始终的定义。 注意这些规则相同 nonexportable 类的。

如果导出类数据类型或返回类的功能,请务必导出类。

dllimport 类

在声明类 dllimport时,导入所有其成员函数和静态数据成员。 不同 dllimport 和 dllexport 行为。 nonclass 类型,静态数据成员。 dllimport 类中定义的同一过程不能指定定义。

继承和可导出类

可导出类的所有基类必须是可导出的。 否则,编译器将生成警告。 此外,还是类的任何可访问的成员必须是可导出的。 此规则只允许 dllexport 类从 dllimport 类继承和 dllimport 类继承自 dllexport 类 (尽管不建议使用后者)。 通常,到 DLL 的客户端是可访问的所有内容 (具体取决于 C++ 访问规则) 应该是可导出接口的一部分。 这在内联函数包括私有数据成员引用。

选择性的成员导入/导出

由于成员函数,并且类中的静态数据隐式具有外部联接,可以声明这些变量 dllimport 或 dllexport 属性,因此,除非整个类导出。 如果导入整个类或导出,成员的显式声明函数和数据,则 dllimport 或 dllexport 禁止。 如果声明在类定义中的静态数据成员作为 dllexport,定义必须在同一程序内发生位置 (与 nonclass 外部连接)。

同样,可以声明与 dllimport 或 dllexport 属性的成员函数。 在这种情况下,必须在同一程序中提供 dllexport 定义某处。

请注意若干有关选择性的成员导入和导出焦点值得的:

  • 选择性的成员导入/导出最适用于提供更为严格的导出类接口的版本使用;即可以设计的 DLL 比该语言显示少量公共和私有函数会授权。 为优化可导出接口也很有用:当知道客户端,按照定义,不能访问某些私有数据,您不需要导出整个类。

  • 如果导出类中的虚函数,必须导出所有,或者至少提供客户端可以直接使用的版本。

  • 如果您使用选择性的成员导入/导出处理虚函数的类,函数必须在 XML 输出接口或内联定义 (前者对客户端)。

  • 如果您在类定义中定义成员为 dllexport ,但不包括它,编译器会生成错误。 必须定义类头的成员。

  • 虽然类成员的定义为 dllimport 或 dllexport 的授予权限,您无法重写在类定义中指定的接口。

  • 如果您定义了一个成员函数是使用除了可以将其声明为类定义的主体外,将生成警告,如果函数定义为 dllexport 或 dllimport (如果在类声明不同指定的此定义与)。

请参见

参考

dllexport, dllimport