对细节的把握

发布于 2022-10-15 09:06:25 字数 702 浏览 28 评论 0

今天公司来的新员工问我一段代码的含义

  1. #ifdef BRIDGE3DWRAPPER
  2. #define MB_BRIDGE3DWRAPPER_EXT __declspec(dllexport)
  3. #else
  4. #define MB_BRIDGE3DWRAPPER_EXT __declspec(dllimport)
  5. #endif

复制代码看起来似乎很简单,以前我也没考虑过这个问题,只是大概的了解__declspec(dllexport)是导出给别的dll使用的意思。但是本着对新人负责的态度,也不能这么给别人解释,所以我就问了一下大家这句话到底啥意思,问了一下,好多人说是导入导出的意思,import,export的中文解释?汗。。。查了一下,才知道原来的确想错了,大家知道这个是什么含义吗?看解释之前请自己想一想。
容易出错的地方:
1.__declspec(dllexport)保留函数相对地址和dll的地址以生成正确的函数调用。
2.__declspec(dllimport)保留函数地址计算后的绝对地址。所以明显比上面的要生成更快的代码。而且两个都从逻辑上表示导出的含义。
3.由于产生时间的先后顺序,就有了上面的宏的结构来保证兼容性和利用新的特性(这个是推测的)。
看起来简单的地方还是很容易想当然的。

大家都想对了吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

摘星┃星的人 2022-10-22 09:06:25

不知道你是查了什么资料,得出这么奇怪的结论?

下面这个是从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;

寄人书 2022-10-22 09:06:25

>> 看起来简单的地方还是很容易想当然的。

看轻我的陪伴 2022-10-22 09:06:25

回复 1# downup

    you gotta be kidding me

  1. #ifdef BRIDGE3DWRAPPER
  2. #define MB_BRIDGE3DWRAPPER_EXT __declspec(dllexport)
  3. #else
  4. #define MB_BRIDGE3DWRAPPER_EXT __declspec(dllimport)
  5. #endif

复制代码这个是典型的DLL头文件声明
如果你是DLL的编写者,就在包含该头文件之前定义BRIDGE3DWRAPPER,这样编译时编译器就会导出DLL的所有函数。
如果你是DLL的使用者,就直接包含头文件,由于没有定义BRIDGE3DWRAPPER,表示使用__declspec(dllimport)把DLL的函数隐式链接进来。

推荐看下《Windows系统编程》第4版,或《Windows Via C/C++》第5版

青丝拂面 2022-10-22 09:06:25

我觉得是防止编译器对名称的扩展

总以为 2022-10-22 09:06:25

帖子哪里抄来的

青瓷清茶倾城歌 2022-10-22 09:06:25

我还是不懂

傻比既视感 2022-10-22 09:06:25

回复 5# chinesedragon

你是说 extern "C" ?

青芜 2022-10-22 09:06:25

對dll我一般只適用 def來定義

风铃鹿 2022-10-22 09:06:25

樓主這樣的寫法很不舒服

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文