zoukankan      html  css  js  c++  java
  • __declspec(dllexport)的使用

    1. 用法

    在 VS 的“预编译”选项里定义_EXPORTING宏

    #ifdef _EXPORTING
    #define API_DECLSPEC __declspec(dllexport)
    #else
    #define API_DECLSPEC __declspec(dllimport)
    #endif
    ​
    API_DECLSPEC void HelloWorld();</pre>

    2. 作用

    2.1.

    __declspec(dllexport)用于导出符号,也就是定义该函数的dll;__declspec(dllimport)用于导入,也就是使用该函数。

    因为这个头文件既要被定义该函数的dll包含,也要被使用该函数的程序包含,当被前者包含时我们希望使用 __declspec(dllexport) 定义函数,当被后者包含时我们希望使用 dllimport。

    2.2.

    假设你的A(EXE或DLL)需要调用B(DLL)中的某个导出函数:__declspec(dllexport) void HelloWorld();

    不用宏,在项目A中直接包含这个头文件,编译、运行……OK。

    打开Dependency Walker(其它合适的工具也可以),打开A(.EXE或.DLL)文件,在左边树中选择根节点,A文件也有导出符号"HelloWorld"

    2.3.

    不使用 declspec(dllimport) 也能正确编译代码,但使用 declspec(dllimport) 使编译器可以生成更好的代码。编译器之所以能够生成更好的代码,是因为它可以确定函数是否存在于 DLL 中,这使得编译器可以生成跳过间接寻址级别的代码,而这些代码通常会出现在跨 DLL 边界的函数调用中。但是,必须使用 __declspec(dllimport) 才能导入 DLL 中使用的变量。

    2.4.

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

    #define DllImport __declspec(dllimport) 
    DllImport int j;
    __declspec(dllexport)是用于避免需要自己写 DEF 文件的。编译器会为被declspec(dllexport)修饰的函数自动添加一个导出函数入口。如果你在其他模块中包含 declspec(dllexport)的头文件,这些项目的导出表中也会生成一个同名导出函数。
  • 相关阅读:
    java核心技术卷上学习笔记
    个人作业——软件工程实践总结作业
    个人作业——软件产品案例分析
    软件工程作业-结对编程 2.0
    软件工程作业-结对编程 1.0
    软件工程作业2.0
    软件工程作业1.0
    《面向对象程序设计》c++第六次作业___calculator SE
    面向对象程序设计作业 6.1~6.4
    面向对象程序设计作业 5.1~5.5
  • 原文地址:https://www.cnblogs.com/lovebay/p/11968095.html
Copyright © 2011-2022 走看看