VS下 dllimport与dllexport作用与区别

VS下 dllimport与dllexport作用与区别我相信写 WIN32 程序的人 做过 DLL 都会很清楚 declspec dllexport 的作用 它就是为了省掉在 DEF 文件中手工定义导出哪些函数的一个方法 当然 如果你的 DLL 里全是 C 的类的话 你无法在 DEF 里指定导出的函数 只能用 declspec dllexport 导出类 但是 MSDN 文档里面 对于 declspec dllimport 的说明让人感觉有点奇怪 先来看看 MSDN

原文:http://www.cnblogs.com/foohack/p/4119207.html

我相信写WIN32程序的人,做过DLL,都会很清楚__declspec(dllexport)的作用,它就是为了省掉在DEF文件中手工定义导出哪些函数的一个方法。当然,如果你的DLL里全是C++的类的话,你无法在DEF里指定导出的函数,只能用__declspec(dllexport)导出类。但是,MSDN文档里面,对于__declspec(dllimport)的说明让人感觉有点奇怪,先来看看MSDN里面是怎么说的:

 

 

_declspec(dllexport)与_declspec(dllimport)

   都是DLL内的关键字,即导出与导入。他们是将DLL内部的类与函数以及数据导出与导入时使用的。主要区别在于,dllexport是在这些类、函数以 及数据的申明的时候使用。用过表明这些东西可以被外部函数使用,即(dllexport)是把DLL中的相关代码(类,函数,数据)暴露出来为其他应用程 序使用。使用了(dllexport)关键字,相当于声明了紧接在(dllexport)关键字后面的相关内容是可以为其他程序使用的。而 dllimport关键字是在外部程序需要使用DLL内相关内容时使用的关键字。当一个外部程序要使用DLL内部代码(类,函数,全局变量)时,只需要在 程序内部使用(dllimport)关键字声明需要使用的代码就可以了,即(dllimport)关键字是在外部程序需要使用DLL内部相关内容的时候才 使用。(dllimport)作用是把DLL中的相关代码插入到应用程序中。

   _declspec(dllexport)与_declspec(dllimport)是相互呼应,只有在DLL内部用dllexport作了声明,才能 在外部函数中用dllimport导入相关代码。实际上,在应用程序访问DLL时,实际上就是应用程序中的导入函数与DLL文件中的导出函数进行链接。而 且链接的方式有两种:隐式迎接和显式链接。

  隐式链接是指通过编译器提供给应用程序关于DLL的名称和DLL函数的链接地址,面在应用程序中不需要显式地将DLL加载到内存,即在应用程序中使用dllimport即表明使用隐式链接。不过不是所有的隐式链接都使用dllimport。

显式链接刚同应用程序用语句显式地加载DLL,编译器不需要知道任何关DLL的信息

 

以下是一个DLL头文件的正规编写方式:

复制代码
 1 #ifdef DIALOG_MAINMENU_EXPORTS  2 #define DIALOG_MAINMENU_API __declspec(dllexport)  3 #else  4 #define DIALOG_MAINMENU_API __declspec(dllimport)  5 #endif  6  7 class Dialog_MainMenu {  8 public:  9 static DIALOG_MAINMENU_API enum GAME_STATES { 10  MAINMENU, GAME, OPTIONS, CREDITS, QUIT 11  }; 12 static DIALOG_MAINMENU_API GAME_STATES CurrentGameState; 13  DIALOG_MAINMENU_API GAME_STATES GetState(); 14 };
复制代码

 

以下是解释:

OK – when you compile the dll – you are exporting the types. So, you need to define the static member in .cpp file of the dll. You also need to make sure that you have enabled the definition of DIALOG_MAINMENU_EXPORTS in compiler settings. This will make sure types are exported.

Now, when you link the console application with the dll – you will #include dll’s header and dont enable any definition of DIALOG_MAINMENU_EXPORTS in compiler settings (just leave the settings default). This will make the compiler understand that now you are importing the types from your dll into exe application.

 

references:

http://stackoverflow.com/questions//unresolved-external-symbol

http://stackoverflow.com/questions//unresolved-external-symbol-declspecdllimport

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/221973.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午4:51
下一篇 2026年3月17日 下午4:51


相关推荐

  • 新一代基座大模型GLM-4

    新一代基座大模型GLM-4

    2026年3月12日
    2
  • 【必藏】Cherry Studio:DeepSeek R1一键部署指南,打造个人AI知识库,程序员必备效率神器!

    【必藏】Cherry Studio:DeepSeek R1一键部署指南,打造个人AI知识库,程序员必备效率神器!

    2026年3月16日
    7
  • 多元统计分析上机题之R语言实现(多元正态分布)

    多元统计分析上机题之R语言实现(多元正态分布)引言本学期也开了一门多元统计分析课程 也趁机想把课后上机题实现一遍 以增强理解 教材使用的是约翰逊的 多元统计分析 第六版 中英文版教材 数据集 讲义见还参考了王斌会老师的 多元统计分析及 R 语言建模 本文内容主要为第 4 章多元正态分布的上机题 图略 rmd 文档见 http pan baidu com s 1ntkuXQT 可以直接用 Rstudio 打开 之前先安装 knitr 包 4 2

    2026年3月18日
    2
  • IP地址和子网划分例题详解

    IP地址和子网划分例题详解1、为什么要划分子网?IPv4地址如果只使用有类(A、B、C类)来划分,会造成大量的浪费或者不够用,为了解决这个问题,可以在有类网络的基础上,通过对IP地址的主机号进行再划分,把一部分划入网络号,就能划分各种类型大小的网络了。2、IPv4子网划分与聚合为了解决IPv4的不足,提高网络划分的灵活性,诞生了两种非常重要的技术,那就是VLSM(可变长子网掩码)和CIDR(无类别域间路由),把传统标准的IPv4有类网络演变成一个更为高效,更为实用的无类网络。关于VLSM和CIDR的介绍参考上篇子网掩码详解有

    2022年6月27日
    96
  • C++标准输入输出流_seekg函数详解

    C++标准输入输出流_seekg函数详解对文件输入输出流的操作函数主要有1/seekg()和tellg() //对输入流的操作(也就是读)2/seekp()和tellp() //对输出流的操作(也就是写) 1.seekg()是对输入文件定位,它有两个参数:第一个参数是偏移量,第二个参数是基地址。对于第一个参数,可以是正负数值,正的表示向后偏移,负的表示向前偏移。而第二个参数可以是:   ios::beg

    2022年5月24日
    54
  • 字节跳动 java面经_字节跳动Java面经(已offer)[通俗易懂]

    5.15一面(3点开始,80分钟)1.自我介绍,聊了聊学校近况2.Java集合框架,看了哪些源码,arraylist、linkedlist原理,让你实现一个hashmap机会如何设计(没让手写????)3.线程池的执行过程、核心参数以及常用的几个线程池(感觉每次面试都会问????)4.JVM的相关知识,OOM如何定位,说几个虚拟机指令以及虚拟机栈可能会发生什么错误,四种引用类型5.Java并发,…

    2022年4月16日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号