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