如何使用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放在同一目录):选择项目->属性->连接器-》常规-》输出文件
  • posted @ 2009-03-27 17:15  dzqabc  阅读(369)  评论(0编辑  收藏  举报