zoukankan      html  css  js  c++  java
  • 动态链接库DLL(2)

    上节已经给大家说过了,DLL进行导出函数有2种方法,那么与之对应的调用DLL的导出函数的方法也有2种。

    1、隐式链接:
    隐式链接的特点是由编译器完成对DLL的加载和程序结束时对DLL的卸载工作,如果程序结束时如果还有其他应用程序使用该DLL,那么系统会使DLL的使用计数减1,当DLL的使用计数降为0时,会将DLL从内存中删除。
    ★优缺点:隐式链接DLL的方法简单实用,但缺少灵活性。

    ■使用方法:使用隐式链接DLL开发时,首先,需要将DLL的引入库文件(*.lib--编译生成DLL时,会一起生成的)与应用程序进行静态链接,因为引入库文件包含DLL的各种输出资源,如导出函数,导出类等信息,这些信息指向DLL的函数指针等等,EXE执行时,DLL被 “自动” 加载,EXE退出时DLL被 “自动” 卸载。

     

     

    2、显示链接:
    显示链接方式是完全由编程者用API 加载和卸载DLL,编程者可以决定何时加载DLL,加载哪个DLL,何时卸载DLL,卸载哪个DLL等。
    ★优缺点:显示链接方式充分体现了DLL的灵活性,是比较常用的调用DLL方式。但是与静态链接相比稍微复杂了些。
    ■使用方法:
    LoadLibrary(...):该 API 用于加载指定的DLL;
    GetProcAddress(...):该 API 用于获取DLL中导出函数的指针, 即导出函数的入口点;
    FreeLibrary(...):该 API 用于卸载指定的DLL。

    〓注:如果程序中多次调用LoadLibrary(...)加载同一DLL时,在卸载的时候也要调用相应次数的FreeLibrary(...)进行卸载。 

     

     

    ▲使用LoadLibrary显式链接,在这个函数的参数中可以指定DLL文件的完整路径。如果不指定路径,Windows将遵循如下的搜索顺序来定位DLL:

    ①EXE文件所在的目录:
    ②进程的当前工作目录:
    ③Windows系统目录:例如:C:\WINDOWS\system32
    ④Windows目录:例如:C:\WINDOWS
    ⑤环境变量的目录:我的电脑-->属性-->高级-->环境变量

    说明:
    ●进程的当前工作目录:使用函数SetCurrentDirectory(...)设置的路径,或者从父进程继承而来的路径,使用GetCurrentDirectory(...)得到。
    ●EXE文件所在的目录:本EXE文件所在的绝对路径, 使用GetModuleFileName得到。
    两者可能不同。

    ▲GetProcAddress函数可以有两种方式取得DLL导出函数的入口点:
    例如:
    GetProcAddress(hMod, "add"); //按照函数名称方式;
    GetProcAddress(hMod, MAKEINTRESOURCEA(1)); //按照导出函数序号方式;

     

  • 相关阅读:
    【C++FAQ】如何设定小数点后的显示位数
    【C++FAQ】怎么输入一行字符串(可能带空格)
    c++ operator重载的例子
    【C++FAQ】怎么给结构体排序
    【IT面试题007】英语字符串的分词程序
    【C++/C FAQ】如何格式化输出以0填充的定长整数
    nginx的root和alias指令的区别
    linux磁盘满了,各种奇怪错误
    使用nginx搭建http代理服务器
    nginx图片过滤处理模块http_image_filter_module安装配置笔记
  • 原文地址:https://www.cnblogs.com/tt_mc/p/1653376.html
Copyright © 2011-2022 走看看