代码改变世界

Dll中导出导入时巧用条件编译指令共享头文件

2007-04-09 13:18  flyingfish  阅读(1126)  评论(0编辑  收藏  举报

同一个解决方案中,如果要在某个DLL工程中封装一些功能,则存在一个导入导出函数或类的问题,导出要用dllexport,导入时则用dllimport。如果不采用预编译指令,可能需要写两份头文件,一份用dllexport声明函数供dll自己用,另一份则用dllimport声明供dll的客户端(或叫宿主)程序用。

这样会很不爽,如果改动,就得两个都改,使用条件编译指令,结合适当的宏定义就可以避免这种麻烦。

1、把如下条件编译指令加在.h文件最前边

//控制是在Dll中使用,还是在客户端用
#ifdef _EXPORTING
#define My_DECLSPEC  __declspec(dllexport) // 导出
#else
#define My_DECLSPEC  __declspec(dllimport) // 导入
#endif

2、然后用这样的方式在.h中定义函数或类

class My_DECLSPEC  MyClass
{
private:
   int i, j; 

public: 
   setupI();

   setupj();

}

My_DECLSPEC void func1();

3、在对应的.cpp中最开始增加宏定义就使dll中使用dllexport

//定义DLL中的导出C++类
#define _EXPORTING

4、当把该.h文件发给dll使用者时,他不定义_EXPORTING就会采用dllimport定义。

这样就达到共享.h文件的目的。