« 英语中10句最"狠"的话« »VC常用数据类型使用转换详解[转] »
如何使用DLL函数动态加载-静态加载

公司里的项目里用到加密解密,使用的是客户指定的DLL库来加密解密.

开始,我按照以前的方法来使用DLL库,这里也介绍下吧,虽然网上很多.一般动态加载DLL的步骤如下:

HINSTANCE  DLL库实例名=LoadLibrary(_T("DLL库名.dll"));//加载解密函数库
typedef BOOL (CALLBACK *函数类型名)(函数参数1,函数参数2...... );//定义函数类型,格式一
//typedef BOOL (__cdecl *函数类型名)(函数参数1,函数参数2...... );//定义函数类型,格式二
函数类型名 使用时的函数名=(函数类型名)GetProcAddress(DLL库实例名,_T("DLL库里的原函数名"));//定义函数 

好了,就这么简单,然后就可以使用"使用时的函数名"这个了,把它当成是一般的函数使用就可以了

一般情况下我都是使用"定义函数类型,格式一"来定义函数类型的,而且网上的方法也都是提供这种方法的,没想到我在项目里使用时,居然总是出现错误,使用try{}catch{}也捕捉不到那个错误,错误的现象为:The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a funtion pointer declared with a different calling convention.

到网上找了一下,了现这个问题别人也经常出现,可惜没几个人给出了好的回答,最后看到一个人提供的方法,就是使用//typedef BOOL (__cdecl *函数类型名)(函数参数1,函数参数2...... );//定义函数类型,格式二.这种格式就没问题了,看来是调用约定不匹配造成的.因此,在使用DLL时还要熟悉这个DLL里函数的格式.


 

  • 也许还看不明白,那我做一个示例

    HINSTANCE mydll=LoadLibrary(_T("C:\\test.dll"));//加载解密函数库
    typedef BOOL (CALLBACK *ADD)(int a,int b);//定义函数类型,格式一
    ADD myadd=(ADD)GetProcAddress(mydll,_T("add"));//定义函数

    使用时:
    int x=2;
    int y=3;
    int r=0;
    r=myadd(x,y);

    结果r=5;
    当然,前提是那就DLL里有add这个函数,且参数也是(int a,int b)
  • 原创文章,支持转载,请标记来自"巴士飞扬技术BLOG" www.busfly.cn

  • 如果不使用动态加载DLL的话,可以使用静态加载,不过,这需要事先得到LIB文件和.H文件,如果这三个文件都有的话,那就可以很方便的加载DLL了,方法如下:

    如何加载DLL
    1(配置头文件路径):选择项目->属性->C/C++-》常规-》附加包含目录:设置引用头文件路径
    2(配置DLL和Lib文件路径):选择项目->属性->连接器-》常规-》附加库目录:设置DLL路径
    3(加载Lib文件):选择项目->属性->连接器-》输入-》附加依赖项:输入要加载的Lib文件名(加载多个Lib文件时,以回车为分隔符)
    4(该主应用程序.exe的生成目录,和要加载的DLL、Lib放在同一目录):选择项目->属性->连接器-》常规-》输出文件
  •  


    Tags: VC   |

    原创文章如转载,请注明:转载自:巴士飞扬-技术BLOG : http://www.busfly.net/

    本文链接地址:http://www.busfly.net/post/22.html

    如果你喜欢本文,请顶一下,支持我,你的支持是我继续发好文章的最大动力。谢谢。
    好东西需要分享,快把本文发给你的朋友吧~!~

         
    相关文章:
    • 引用此留言  2.巴士飞扬  http://www.busfly.cn
    • 如果不使用动态加载DLL的话,可以使用静态加载,不过,这需要事先得到LIB文件和.H文件,如果这三个文件都有的话,那就可以很方便的加载DLL了,方法如下:

      如何加载DLL
      1(配置头文件路径):选择项目->属性->C/C++-》常规-》附加包含目录:设置引用头文件路径
      2(配置DLL和Lib文件路径):选择项目->属性->连接器-》常规-》附加库目录:设置DLL路径
      3(加载Lib文件):选择项目->属性->连接器-》输入-》附加依赖项:输入要加载的Lib文件名(加载多个Lib文件时,以回车为分隔符)
      4(该主应用程序.exe的生成目录,和要加载的DLL、Lib放在同一目录):选择项目->属性->连接器-》常规-》输出文件
    • [删除]2007-8-9 17:42:36 回复该留言
    • 引用此留言  1.巴士飞扬  http://www.busfly.cn
    • 也许还看不明白,那我做一个示例

      HINSTANCE mydll=LoadLibrary(_T("C:\\test.dll"));//加载解密函数库
      typedef BOOL (CALLBACK *ADD)(int a,int b);//定义函数类型,格式一
      ADD myadd=(ADD)GetProcAddress(mydll,_T("add"));//定义函数

      使用时:
      int x=2;
      int y=3;
      int r=0;
      r=myadd(x,y);

      结果r=5;
      当然,前提是那就DLL里有add这个函数,且参数也是(int a,int b)
    • [删除]2007-8-9 17:25:47 回复该留言




    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
    网站分类
    分类最近文章
    最近发表
    最新评论及回复
    最近留言
    热文排行
    随机推荐文章
    Powered By Z-Blog   STYLE by busfly . FatMouse
    Copyright © 2007 巴士飞扬技术博客. . 沪ICP备07027972号. 会员群1(J2EE为主):3769186.