dll头文件宏的作用

标准的DLL头文件中都会有这么一段宏

#ifdef _EXPORTING






#define


API_DECLSPEC __declspec(dllexport)









#else









#define


API_DECLSPEC __declspec(dllimport)









#endif










然后用







API_DECLSPEC


修饰声明的函数



 

 









例如






首先是在DllDemo.h声明:



C/C++ code
    
    
    
    




#ifdef _EXPORTING






#define


API_DECLSPEC __declspec(dllexport)









#else









#define


API_DECLSPEC __declspec(dllimport)









#endif














API_DECLSPEC



void


FunA();





在DllDemo.cpp写这个函数的实现:



C/C++ code
    
    
    
    







void





FunA()






{



AfxMessageBox(_T(



"


HelloWorld


"


));







}








  



最后在DllDemo工程里添加预处理器:_EXPORTING。
这等于告诉大家:定义了这个预处理器的就是把函数导出,不定义这个预处理器的就是把函数导



入。

你写dll的时候,使用的是dllexport来导出接口,
而别人使用你的dll的时候,相对的来说,是导入接口,即dllimport

使 用宏的好处是,只需要一个定义,既可以在你写dll时使用,给别人头文件时也不需要修改相应的定义。
关于 __declspec(dllimport)我刚才找了一下,有人写过相关的文章,大意是说,不用这个也链接器也能工作,不过用它更好。原文是说:
不使用 __declspec(dllimport) 也能正确编译代码,但使用 __declspec(dllimport) 使编译器可以生成更好的代码。编译器之所以能够生成更好的代码,是因为它可以确定函数是否存在于 DLL 中,这使得编译器可以生成跳过间接寻址级别的代码,而这些代码通常会出现在跨 DLL 边界的函数调用中。但是,必须使用 __declspec(dllimport) 才能导入 DLL 中使用的变量。  

你参看一下这个: http://blog.csdn.net/Repeaterbin/archive/2009/06/15/4269666.aspx
1、变量需要显示地导入。
2、如果不使用 __declspec(dllimport),那么编译生成的代码最终会类似:
  call 0xXXXXXXXX
  0xXXXXXXXX: jmp dword ptr __imp_function
而如果使 用了dllimport,连接器会直接生成如下代码,省去中间的间接调用:
  call dword ptr __imp_func
3、 在网上看到如果类中用了static变量,也需要使用dllimport。

导入全局、静态或者类成员变量需要__declspec(dllimport)。

#define DllImport __declspec(dllimport) 

DllImport int j;

__declspec(dllexport) 是用于避免需要自己写DEF文件的。编译器会为被__declspec(dllexport)修饰的函数自动添加一个导出函数入口。如果你在其他模块中包 含__declspec(dllexport)的头文件,这些项目的导出表中也会生成一个同名导出函数。

 







你可能感兴趣的:(工作,api,function,dll,编译器)