问题描述:
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 出现如下的错误信息:
- 获取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;
}
原文链接: https://www.cnblogs.com/luosongchao/p/3598906.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/123032
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!