|
发表于 2010-7-13 21:13:01
|
显示全部楼层
在VC中,所有的导出函数要么在def文件中指定(只能针对C函数,系统函数都是采用这种方式),要么使用VC扩展指令指定(可以导出C++类和函数、全局变量),在需要导出类的地方需要使用__declspec(dllexport),则编译成DLL时,该类就会被导出,如:
class __declspec(dllexport) MyClass { };
而在需要使用该类的地方,则需要使用__declspec(dllimport)来导入,如:
class __declspec(dllimport) MyClass { };
由于我们使用的头文件都是一个,所以一般的都会采用宏的方式来分别这两种情况,你说的那个全部应该是这样的:
#if defined (ACE_HAS_DLL)
# if (ACE_HAS_DLL == 1)
# if defined (ACE_BUILD_DLL)
# define ACE_Export ACE_Proper_Export_Flag
# define ACE_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
# define ACE_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
# else
# define ACE_Export ACE_Proper_Import_Flag
# define ACE_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
# define ACE_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
# endif /* ACE_BUILD_DLL */
# else
# define ACE_Export
# define ACE_SINGLETON_DECLARATION(T)
# define ACE_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
# endif /* ! ACE_HAS_DLL == 1 */
#else
# define ACE_Export
# define ACE_SINGLETON_DECLARATION(T)
# define ACE_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
#endif /* ACE_HAS_DLL */
这里分别根据使用编译ACE为DLL还是静态库来定义ACE_export宏(因为静态库并不需要前面的方式来导出、导入,所以后面的定义是空),而当你编译DLL时,则会是前面两种情况中的一种(如果你查看ACE_Proper_Export_Flag和ACE_Proper_Import_Flag,这二者分别定义为我前面说的情况,ACE编译DLL使用ACE_Proper_Export_Flag,即__declspec (dllexport),因为ACE工程中定义了ACE_BUILD_DLL宏,而我们的程序中只要不定义这个宏,则使用ACE_Proper_Import_Flag,即__declspec (dllimport),这样,我们就通过一个头文件实现了类的导出和导入了,而不需要分别写不同的头文件)。
另外,从VC2005开始,如果我们新建DLL工程,当你在Application Settings页面选中Export symbols时,VS也会帮我们生成类似的定义。省去了一些工作,之前的VC版本,这需要我们自己来做。 |
|