对细节的把握
今天公司来的新员工问我一段代码的含义
- #ifdef BRIDGE3DWRAPPER
- #define MB_BRIDGE3DWRAPPER_EXT __declspec(dllexport)
- #else
- #define MB_BRIDGE3DWRAPPER_EXT __declspec(dllimport)
- #endif
复制代码看起来似乎很简单,以前我也没考虑过这个问题,只是大概的了解__declspec(dllexport)是导出给别的dll使用的意思。但是本着对新人负责的态度,也不能这么给别人解释,所以我就问了一下大家这句话到底啥意思,问了一下,好多人说是导入导出的意思,import,export的中文解释?汗。。。查了一下,才知道原来的确想错了,大家知道这个是什么含义吗?看解释之前请自己想一想。
容易出错的地方:
1.__declspec(dllexport)保留函数相对地址和dll的地址以生成正确的函数调用。
2.__declspec(dllimport)保留函数地址计算后的绝对地址。所以明显比上面的要生成更快的代码。而且两个都从逻辑上表示导出的含义。
3.由于产生时间的先后顺序,就有了上面的宏的结构来保证兼容性和利用新的特性(这个是推测的)。
看起来简单的地方还是很容易想当然的。
大家都想对了吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
不知道你是查了什么资料,得出这么奇怪的结论?
下面这个是从MSDN中文版里面查出来的:
就数据而言,使用 __declspec(dllimport) 是移除间接层的方便手段。从 DLL 导入数据时,仍需要仔细检查导入地址表。在 __declspec(dllimport) 之前,这意味着在访问从 DLL 导出的数据时必须记住进行额外的间接寻址:
复制代码
// project.h
#ifdef _DLL // If accessing the data from inside the DLL
ULONG ulDataInDll;
#else // If accessing the data from outside the DLL
ULONG *ulDataInDll;
#endif
然后导出 .DEF 文件中的数据:
复制代码
// project.def
LIBRARY project
EXPORTS
ulDataInDll CONSTANT
并从 DLL 外部访问这些数据:
复制代码
if (*ulDataInDll == 0L)
{
// Do stuff here
}
将数据标记为 __declspec(dllimport) 时,编译器自动为您生成间接代码。您不必再为上述步骤操心了。如前所述,生成 DLL 时不要在数据上使用 __declspec(dllimport) 声明。DLL 内部的函数不使用导入地址表访问数据对象;因此,不会再有额外的间接寻址了。
若要自动从 DLL 导出数据,请使用此声明:
复制代码
__declspec(dllexport) ULONG ulDataInDLL;
>> 看起来简单的地方还是很容易想当然的。
回复 1# downup
you gotta be kidding me
复制代码这个是典型的DLL头文件声明
如果你是DLL的编写者,就在包含该头文件之前定义BRIDGE3DWRAPPER,这样编译时编译器就会导出DLL的所有函数。
如果你是DLL的使用者,就直接包含头文件,由于没有定义BRIDGE3DWRAPPER,表示使用__declspec(dllimport)把DLL的函数隐式链接进来。
推荐看下《Windows系统编程》第4版,或《Windows Via C/C++》第5版
我觉得是防止编译器对名称的扩展
帖子哪里抄来的
我还是不懂
回复 5# chinesedragon
你是说 extern "C" ?
對dll我一般只適用 def來定義
樓主這樣的寫法很不舒服