问题描述:
C++调用DLL接口
问题解决:
1、声明提取DLL函数
typedef int (_stdcall *plib_ver)(unsigned int *nVer); typedef int (_stdcall * pdes_encrypt)(unsigned char *szOut,unsigned char *szIn , unsigned int inlen,unsigned char *key,unsigned int keylen); typedef int (_stdcall * pdes_decrypt)(unsigned char *szOut,unsigned char *szIn , unsigned int inlen,unsigned char *key,unsigned int keylen);
extern plib_ver lib_ver;
extern pdes_encrypt des_encrypt ;
extern pdes_decrypt des_decrypt ;
其中_stdcall这个关键字修饰的函数,其参数都是从右向左通过堆栈传递的(__fastcall 的前面部分由ecx,edx传), 函数调用在返回前要由被调用者清理堆栈。extern 声明DLL接口函数地址,在其他文件中实现,参见第二条:获取DLL函数地址
在使用中未声明_stdcall 出现如下的错误信息:
2. 获取DLL函数地址
int init(char *path) { lib=LoadLibrary(path); if(lib) { lib_ver = (plib_ver)GetProcAddress(lib,("lib_ver")); des_encrypt = (pdes_encrypt)GetProcAddress(lib,("des_encrypt")); des_decrypt = (pdes_decrypt)GetProcAddress(lib,("des_decrypt")); if(NULL == lib_ver || NULL == des_encrypt || NULL == des_decrypt ) { return 1; } } return 0; }
LoadLibrary载入指定的动态链接库,并将它映射到当前进程使用的地址空间。一旦载入,即可访问库内保存的资源
GetProcAddress函数检索指定的动态链接库(DLL)中的输出库函数地址。
3、使用DLL函数
int open(int port,int baud) { char path[]="C:\Users\Administrator\Desktop\JT500 RFID\JT500RFID\rfid\rfid\MasterRD.dll"; int ret=init(path); ret&=rf_init_com(port,baud); return ret; }
4、释放DLL
int close() { int ret=rf_ClosePort(); if (lib!=NULL) { ret&=FreeLibrary(lib); lib=NULL; } return ret; }