zoukankan      html  css  js  c++  java
  • visual c++ 动态链接库调用总结

         由于每次使用动态链接库的时候都要重新去查资料,查调用方式,有些烦躁,本人抽点时间在此做个总结,希望可以对需要的朋友有所帮助。

    1,显式加载方式加载动态链接库

    简单易懂,随掉随用

    (1)          将dll考到当前工作目录,或者使用GetModuleFileName函数获取当前执行目录得到相对路径,亦或者使用绝对路径进行加载。

    (2)          得到dll实例句柄

    HMODULE LoadLibrary( LPCTSTR lpFileName )

    ( 3 ) 获取dll中导出函数的地址

    FARPROC GetProcAddress( HMODULE hModule,LPCSTR lpProcName )

    Ex:typedef int (*ADDPROC)( int a, int b )

    ADDPROC Add=(ADDPROC)GetProcAddress(hinst,”add”);

    (4)FreeLibrary()调用结束释放实例。

    2         隐式加载方式加载动态链接库

    一:基本调用流程

    (1)      使用_declspec(dllexport)导出函数

    比如

    _declspec(dllexport) int add( int a,  int b  )

    添_stdcall extern c可有效解决名字改编问题

    _stdcall extern c _declspec(dllexport) int add( int a,  int b  )

    (2)  将dll文件考到当前工程,并连接lib文件

    Vc6可以通过link连接,vs系列可以通过依赖库连接

    或者使用一种通用的方式加载,通过路径加载

    #pragma comment(lib,"../SDK/Sadp.lib")

    (3)在调用处用extern做外部定义声明

        Ex:extern int add( int a , int b )

       或者_declspec(dllimport) int add( int a,  int b  )

    二:模块定义文件(可有效解决名字改编问题)参考网络通信库

    Library xxx.dll

    EXPORTS

    Add。。。。

    3         显式加载和隐式加载的比较

    个人比较崇尚显示加载两个原因:

    1,        随掉随用,易懂,并且不会因为某一个导出函数的调用的失败导致程序的崩溃

    2,        节省内存,调用结束直接释放实例,而隐式加载从程序开始运行就一直伴随着程序的整个过程,当dll比较多的时候很浪费内存。



  • 相关阅读:
    使用Linq 更新数据库时遇到的一些问题及解决办法
    Asp.net 初级面试(转)
    jQuery设计思想
    WinCE BSP的BIB文件介绍
    团队管理经验(转)
    35岁以前成功的9大好习惯
    早起的十个好处,以及如何做到早起
    男人魅力的九个方面
    SQL优化34条(转)
    深入理解Javascript闭包(closure)
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3231118.html
Copyright © 2011-2022 走看看