用户工具

站点工具


vs2015:dll隐式与显式调用

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

后一修订版
前一修订版
vs2015:dll隐式与显式调用 [2020/03/22 17:09] – 创建 zhangguovs2015:dll隐式与显式调用 [2023/03/17 10:12] (当前版本) – 外部编辑 127.0.0.1
行 1: 行 1:
 C++ DLL的隐式与显式调用 C++ DLL的隐式与显式调用
 +
 +====== 个人理解 ======
 +
 +DLL分为显式与隐式调用,显式不需要.lib文件,而隐式需要.lib文件
 +
 +但是这里有一个重要的问题,即visual stuido工具不同版本间的问题,目前vs主要三大版本vc2015, vc2017, vc2019,如果低版本vs使用高版本vc生成出来的.lib很有可能有问题(不知道是不是叫binary-compatibility restriction https://docs.microsoft.com/en-us/cpp/porting/binary-compat-2015-2017?view=vs-2019) ,, 所以从这点考虑突显了显式调用的优点,因为它不需要.lib文件。
 +
 +
 +目前我遇到的FT D2XX 驱动的问题有可能就是这个问题, 有可能是使用的vs2017做的,而我目前使用的是vc2015。还有一个原因是静态库.lib文件与动态库引入库.lib文件是不一样的,前者一般文件较大上M,而后者一般就只有几十KB。
 +
 +^                                                             |
 +| Operating System  | Release Date  | x86 (32-bit)  | x64 (64-bit)  |
 +| Windows*          | 2017-08-30    | 2.12.28       | 2.12.28       |
 +
 +
 +
 +
 +====== 网上参考文章 ======
 +
 +
 +
 +
 +
 +原文链接:https://www.cnblogs.com/johngu/p/7877939.html
  
  
 C++ dll的隐式与显式调用 C++ dll的隐式与显式调用
   应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接。在使用DLL之前首先要知道DLL中函数的结构信息。Visual C++6.0(或者更先进的版本)在VC\bin目录下提供了一个名为Dumpbin.exe的小程序(使用方法见VS自带工具:dumpbin的使用),用它可以查看DLL文件中的函数结构。另外,Windows系统将遵循下面的搜索顺序来定位DLL: 1.包含EXE文件的目录,2.进程的当前工作目录, 3.Windows系统目录, 4.Windows目录,5.列在Path环境变量中的一系列目录。   应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接。在使用DLL之前首先要知道DLL中函数的结构信息。Visual C++6.0(或者更先进的版本)在VC\bin目录下提供了一个名为Dumpbin.exe的小程序(使用方法见VS自带工具:dumpbin的使用),用它可以查看DLL文件中的函数结构。另外,Windows系统将遵循下面的搜索顺序来定位DLL: 1.包含EXE文件的目录,2.进程的当前工作目录, 3.Windows系统目录, 4.Windows目录,5.列在Path环境变量中的一系列目录。
 +
 +VS下动态库dll的显式调用
 +
 +动态库的加载分两种形式:分为静态加载和动态加载。<color #ed1c24>静态加载时,对应的头文件、DLL,和LIB缺一不可,并且生产的EXE没有找到DLL文件就会导致“应用程序初始化失败”。动态加载只需要dll,通过LoadLibrary()函数进行加载,但该方式对生成的dll的规范有一定的要求否则容易出错。</color>
 +————————————————
 +版权声明:本文为CSDN博主「同窗笑语」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
 +原文链接:https://blog.csdn.net/liangyanghui/article/details/77981848
  
   1.隐式链接   1.隐式链接
行 53: 行 84:
   在上例中使用类型定义关键字typedef,定义指向和DLL中相同的函数原型指针,然后通过LoadLibray()将DLL加载到当前的应用程序中并返回当前DLL文件的句柄,然后通过GetProcAddress()函数获取导入到应用程序中的函数指针,函数调用完毕后,使用FreeLibrary()卸载DLL文件。在编译程序之前,首先要将DLL文件拷贝到工程所在的目录或Windows系统目录下。   在上例中使用类型定义关键字typedef,定义指向和DLL中相同的函数原型指针,然后通过LoadLibray()将DLL加载到当前的应用程序中并返回当前DLL文件的句柄,然后通过GetProcAddress()函数获取导入到应用程序中的函数指针,函数调用完毕后,使用FreeLibrary()卸载DLL文件。在编译程序之前,首先要将DLL文件拷贝到工程所在的目录或Windows系统目录下。
  
-  使用显式链接应用程序编译时不需要使用相应的Lib文件。另外,使用GetProcAddress()函数时,可以利用MAKEINTRESOURCE()函数直接使用DLL中函数出现的顺序号,如将GetProcAddress(hDLL,"Min")改为GetProcAddress(hDLL, MAKEINTRESOURCE(2))(函数Min()在DLL中的顺序号是2),这样调用DLL中的函数速度很快,但是要记住函数的使用序号,否则会发生错误。+  <color #ed1c24>使用显式链接应用程序编译时不需要使用相应的Lib文件</color>。另外,使用GetProcAddress()函数时,可以利用MAKEINTRESOURCE()函数直接使用DLL中函数出现的顺序号,如将GetProcAddress(hDLL,"Min")改为GetProcAddress(hDLL, MAKEINTRESOURCE(2))(函数Min()在DLL中的顺序号是2),这样调用DLL中的函数速度很快,但是要记住函数的使用序号,否则会发生错误。
  
 注意两点: 注意两点:
vs2015/dll隐式与显式调用.1584868195.txt.gz · 最后更改: 2023/03/17 10:12 (外部编辑)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki