C++调用DLL

问题描述:

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 出现如下的错误信息:

0_1327~1

  1. 获取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

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月10日 下午7:47
下一篇 2023年2月10日 下午7:57

相关推荐