zoukankan      html  css  js  c++  java
  • C++ 调用dll及lib的区别

    C++ 调用DLL方法

      ①LIB文件直接加入到工程文件列表中

      在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中"Add Files to Project"菜单,在弹出的文件对话框中选中要加入DLL的LIB文件即可。

      ②设置工程的 Project Settings来加载DLL的LIB文件

      打开工程的 Project Settings菜单,选中Link,然后在Object/library modules下的文本框中输入DLL的LIB文件。

      ③通过程序代码的方式

      加入预编译指令#pragma comment (lib,"*.lib"),这种方法优点是可以利用条件预编译指令链接不同版本的LIB文件。因为,在Debug方式下,产生的LIB文件是Debug版本,如Regd.lib;在Release方式下,产生的LIB文件是Release版本,如Regr.lib。

     

    静态链接库LIB和动态链接库DLL的区别

     

    1.什么是静态连接库,什么是动态链接库
             静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接 库。静态链接库与静态链接库调用规则总体比较如下。

    对于静态链接库(比较简单):
    首先,静态链接库的使用需要库的开发者提供生成库的.h头文件和.lib文件。

    生成库的.h头文件中的声明格式如下:
    extern "C" 函数返回类型 函数名(参数表);
    在调用程序的.cpp源代码文件中如下:
    #include "..\lib.h"
    #pragma comment(lib,"..\\debug\\libTest.lib") 
    //指定与静态库一起链接

    第二,因为静态链接库是将全部指令都包含入调用程序生成的EXE文件中。因此如果用的是静态链接库,那么也就不存在“导出某个函数提供给用户使用”的情况,要想用就得全要!要不就都别要!:)

    对于动态链接库:
    动态链接库的使用需要库的开发者提供生成的.lib文件和.dll文件。或者只提供dll文件。
    首先我们必须先注意到DLL内的函数分为两种: 
    (1)DLL 导出函数,可供应用程序调用; 
    (2)DLL 内部函数,只能在 DLL 程序使用,应用程序无法调用它们。
    因此调用程序若想调用DLL中的某个函数就要以某种形式或方式指明它到底想调用哪一个函数。

     

     

     

    C++如何调用DLL呢,有两种,一种是静态,另外一种是动态,即通过调用windowsAPI 来加载和卸载DLL,具体思路:

     

    1.先编写一个DLL,我这里是直接在CPP里编写了函数声明和定义,没有单独的头文件,因为很多情况下的DLL都是没有和lib和头文件一起的。

     

    2.然后另外新建一个项目,来调用DLL,方法是:

     

    1.声明头文件<windows.h>,说明我想用windows32方法来加载和卸载DLL

     

    2.然后用typedef定义一个指针函数类型.typedef  void(*fun) //这个指针类型,要和你调用的函数类型和参数保持一致,记住,是指针参数就是(int *,int)

     

    3.定一个句柄实例,用来取DLL的实例地址。HINSTANCE hdll;

     

    格式为hdll=LoadLibrary(“DLL地址”);这里字符串类型是LPSTR,当是unicode字符集的时候会不行,因此要在配置-属性-常规里面把默认字符集“unicode”改成支持多字符扩展即可。

     

    4.取的地址要判断,返回的句柄是否为空,如果为无效句柄,那么要释放加载DLL所占用的内存。

     

    FreeLibrary(hdll);

     

    5.然后定义一个函数指针,用来获取你要用的函数地址,这个咋用呢?

     

    先是定一个函数指针 fun FUN;然后通过GetProcAdress来获取函数的地址,这个函数参数是什么呢?

     

    参数是DLL的句柄和你要调用的函数名:比如:FUN=(fun)GetProcAdress(hdll,"sum");

     

    这里也要判断要函数指针是否为空,如果没取到要求的函数,那么要释放句柄

     

    FreeLibrary(hdll);

     

    6.然后通过函数指针来调用函数。

     

    FUN(int *p,int count);这里不能用函数名来使用函数,因为这个DLL本身不是当前CPP的一部分,而是通过windows去调用.没有在这个工程里声明或者定义,而是暴露出一个头,要指针获取他的地址,通过指针来调用.

     

    最后调用结束后,就释放句柄

     

    FreeLibrary(hdll);

     

  • 相关阅读:
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1553 数字反转(升级版)
    8.4 确定两个日期之间的月份数或年数
    (Java实现) 洛谷 P1553 数字反转(升级版)
  • 原文地址:https://www.cnblogs.com/dongxiao/p/2555264.html
Copyright © 2011-2022 走看看