现在的位置: 首页 > 综合 > 正文

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

2012年10月09日 ⁄ 综合 ⁄ 共 1551字 ⁄ 字号 评论关闭
如何使用DLL函数动态加载-静态加载


<!--
google_ad_client = "pub-8432098110340913";
/* busfly_ss_内容区左上 250x250, 创建于 08-2-2 */
google_ad_slot = "2731136837";
google_ad_width = 250;
google_ad_height = 250;
//-->

公司里的项目里用到加密解密,使用的是客户指定的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放在同一目录):选择项目->属性->连接器-》常规-》输出文件

  • 抱歉!评论已关闭.