__declspec(dllexport)
- 声明一个导出函数,是说这个函数要从本DLL导出。我要给别人用。一般用于dll中
- 省掉在DEF文件中手工定义导出哪些函数的一个方法。当然,如果你的DLL里全是C++的类的话,你无法在DEF里指定导出的函数,只能用__declspec(dllexport)导出类
__declspec(dllimport)
- 声明一个导入函数,是说这个函数是从别的DLL导入。我要用。一般用于使用某个dll的exe中
- 不使用 __declspec(dllimport) 也能正确编译代码,但使用 __declspec(dllimport) 使编译器可以生成更好的代码。编译器之所以能够生成更好的代码,是因为它可以确定函数是否存在于 DLL 中,这使得编译器可以生成跳过间接寻址级别的代码,而这些代码通常会出现在跨 DLL 边界的函数调用中。但是,必须使用 __declspec(dllimport) 才能导入 DLL 中使用的变量。
使用举例:
// File: SimpleDLLClass.h
#ifdef SIMPLEDLL_EXPORT #define DLL_EXPORT __declspec(dllexport) #else #define DLL_EXPORT #endif
class DLL_EXPORT SimpleDLLClass { public: SimpleDLLClass(); virtual ~SimpleDLLClass();
virtual getValue() { return m_nValue;}; private: int m_nValue; };
|
// File: SimpleDLLClass.cpp
#include "SimpleDLLClass.h"
SimpleDLLClass::SimpleDLLClass() { m_nValue=0; }
SimpleDLLClass::~SimpleDLLClass() { }
|
说明:
1. 在你的APP中include SimpleDLLClass.h时,如果你的APP的项目不定义SIMPLEDLL_EXPORT,则DLL_EXPORT不存在。此时APP仍可以正常运行。
// File: SimpleDLLClass.h static int m_nValue;
// File: SimpleDLLClass.cpp int SimpleDLLClass::m_nValue=0;
|
说明:
1. 如果你的APP的项目不定义SIMPLEDLL_EXPORT,则DLL_EXPORT不存在。此时APP无法LINK。原因是找不到m_nValue。(原因:静态变量m_nValue已被DLL导出,但SimpleDLLClass无法访问m_nValue)
Workaround:
#define DLL_EXPORT __declspec(dllimport)
Conclusion:
dllimport是为了更好的处理类中的静态成员变量(或者其他...)的,如果没有静态成员变量(或者其他...),那么这个__declspec(dllimport)无所谓.
阅读(2458) | 评论(1) | 转发(0) |