• 如何使用DLL函数动态加载静态加载


    如何使用DLL函数动态加载-静态加载

    < type="text/javascript"><!-- google_ad_client = "pub-8432098110340913"; /* busfly_ss_内容区左上 250x250, 创建于 08-2-2 */ google_ad_slot = "2731136837"; google_ad_width = 250; google_ad_height = 250; //--> < src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">

    公司里的项目里用到加密解密,使用的是客户指定的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)
  • 如果不使用动态加载DLL的话,可以使用静态加载,不过,这需要事先得到LIB文件和.H文件,如果这三个文件都有的话,那就可以很方便的加载DLL了,方法如下:

    如何加载DLL
    1(配置头文件路径):选择项目->属性->C/C++-》常规-》附加包含目录:设置引用头文件路径
    2(配置DLL和Lib文件路径):选择项目->属性->连接器-》常规-》附加库目录:设置DLL路径
    3(加载Lib文件):选择项目->属性->连接器-》输入-》附加依赖项:输入要加载的Lib文件名(加载多个Lib文件时,以回车为分隔符)
    4(该主应用程序.exe的生成目录,和要加载的DLL、Lib放在同一目录):选择项目->属性->连接器-》常规-》输出文件
  • 相关阅读:
    Dependent Parameters in Concurrent Program using Special Value Set
    USER Management | Role Categories | Roles | Indirect Responsibilities
    asp.net core 1.0初识
    ASP.NET Core管道深度剖析
    linux图机界面机制
    类对象管理方式
    UNICODE串转换成char类型串的四种方法
    进程句柄表与创建句柄表
    虚拟化技术
    Windows基于Apache的svn服务器配置
  • 原文地址:https://www.cnblogs.com/dongzhiquan/p/1994924.html
  • Copyright © 2020-2023  润新知