vc下DLL/lib的调用

原创 2007年09月13日 13:10:00

调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同。Windows提供了两种将DLL映像到进程地址空间的方法:

  1、隐式的加载时链接

  这种方法需要DLL工程经编译产生的LIB文件,此文件中包含了DLL允许应用程序调用的所有函数的列表,当链接器发现应用程序调用了LIB文件列出的某个函数,就会在应用程序的可执行文件的文件映像中加入一些信息,这些信息指出了包含这个函数的DLL文件的名字。当这个应用程序运行时,也就是它的可执行文件被操作系统产生映像文件时,系统会查看这个映像文件中关于DLL的信息,然后将这个DLL文件映像到进程的地址空间。

  系统通过DLL文件的名称,试图加载这个文件到进程地址空间时,它寻找DLL 文件的路径按照先后顺序如下:

  ·程序运行时的目录,即可执行文件所在的目录;

  ·当前程序工作目录

  ·系统目录:对于Windows95/98来说,可以调用GetSystemDirectory函数来得到,对于WindowsNT/2000来说,指的是32位Windows的系统目录,也可以调用GetSystemDirectory函数来得到,得到的值为SYSTEM32。

  ·Windows目录

  ·列在PATH环境变量中的所有目录

  VC中加载DLL的LIB文件的方法有以下三种:

  ①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。

  当应用程序对DLL的LIB文件加载后,还需要把DLL对应的头文件(*.h)包含到其中,在这个头文件中给出了DLL中定义的函数原型,然后声明。

  2、显式的运行时链接

  隐式链接虽然实现较简单,但除了必须的*.dll文件外还需要DLL的*.h文件和*.lib文件,在那些只提供*.dll文件的场合就无法使用,而只能采用显式链接的方式。这种方式通过调用API函数来完成对DLL的加载与卸载,其能更加有效地使用内存,在编写大型应用程序时往往采用此方式。这种方法编程具体实现步骤如下:

  ①使用Windows API函数Load Library或者MFC提供的AfxLoadLibrary将DLL模块映像到进程的内存空间,对DLL模块进行动态加载。

  ②使用GetProcAddress函数得到要调用DLL中的函数的指针。

  ③不用DLL时,用Free Library函数或者AfxFreeLibrary函数从进程的地址空间显式卸载DLL。 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

vc下DLL/lib的调用

调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同。Windows提供了两种将DLL映像到进程地址空间的方法:   1、隐式的...

vc调用动态库dll和lib

在VC使用DevIL: lib dll #include的相关设置

最近要做一个美术UI资源打包工具,即是把一堆零碎的小图片整合在几张指定规格的大图片上,需要用到图形库DevIL。开始在VC工程里加入DevIL时弄了N久很没成功,后来和同事讨论了下,逐渐明朗了。和大家...

VC DLL转lib

一、使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件 EXAMPLE: DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:Vide...

vc++ External dependencies;静态lib使用dll

External   Dependencies是说你没有把这个文件加入到这个工程中,但是需要这个文件的支持。当然有时是误操作。比如你从工程里面删除了abc.h但是在其中一个文件中用#include包含...

VC中的lib和dll

1.概论   先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无...

入门知识之——VC++ 静态链接库和动态链接库的配置 (lib、dll)

开发的时候,经常会遇到要加载开源库或者其他人写的静态链接库,动态链接库。很多新手对于在vc++(2003以上版本,本人不熟悉6.0,所以本篇讲的都是在2003以上版本中的配置方法)怎样配置库文件不太清...

VC.Net中创建与使用静态链接库(lib)和动态链接库(dll),以及它们的区别

VC.Net中创建与使用静态链接库(lib)和动态链接库(dll),以及它们的区别. 使用静态库需要h文件和.lib,在项目中使用静态库需要以下步骤: 1.在项目中包含相应的静态库头文件. 2....

VC编译\链接\运行:包含文件、包含库lib、包含动态库dll的一些问题

在代码开发的过程中,常常碰到编译、链接、运行时加载dll 的问题,简单罗列一下: 1. 未包含头文件:         报错信息可能为: 编译错误 函数/类未定义   2. 包含头文件,未包含库lib...

VC++中生成DLL和LIB文件

1.概论   先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)