zoukankan      html  css  js  c++  java
  • Qt 加载DLL的几种方式小结

    使用Qt Creator创建DLL

    这里其实主要是针对Qt Creator的新手写的,下面以截图的方式进行讲解:

    1.1、创建项目的时候选择,Library > C++库,然后点击“choose”按钮

    1.2、选择“共享库”,输入DLL的名称,然后点击“下一步”按钮,接下来的页面默认下一步即可。

    1.3、创建完后,工程目录结构如下

    1.4、在DLL中写代码,示例代码如下:

     1 #ifndef IAMDLL_H
     2 #define IAMDLL_H
     3  
     4 #include "iamdll_global.h"
     5 #include <windows.h>
     6  
     7 class IAMDLLSHARED_EXPORT IamDLL
     8 {
     9 public:
    10     IamDLL();
    11  
    12     /**
    13      * @brief 求a+b的和
    14      *
    15      * @param a 入参a
    16      * @param b 入参b
    17      * @return int
    18      */
    19     int add(int a, int b);
    20 };
    21  
    22 /**
    23  * @brief   求a*b
    24  */
    25 extern "C" int IAMDLLSHARED_EXPORT DoMult(int a, int b);
    26 typedef int(WINAPI * LPFN_MULT)(int, int);
    27  
    28 /**
    29  * @brief   求a/b
    30  */
    31 extern "C" int IAMDLLSHARED_EXPORT DoDiv(int a, int b);
    32 typedef int(WINAPI * LPFN_DIV)(int, int);
    33  
    34 /**
    35  * @brief   登陆参数
    36  */
    37 extern "C" std::string IAMDLLSHARED_EXPORT DoLogin(std::string user, std::string pswd);
    38 typedef std::string(WINAPI * LPFN_LOGIN)(std::string, std::string);
    39  
    40  
    41 #endif // IAMDLL_H

    1.5、构建,然后会在默认生成的文件夹下生成几个文件:DLL文件,库文件(lib*.a)

     

    加载DLL的三种方式

    一、LoadLibrary方式

     1 //方法壹:使用LoadLibrary
     2     HINSTANCE hDll = LoadLibraryA("IamDLL");
     3     if(hDll)
     4     {
     5         qDebug() << "
    ";
     6         qDebug() << "LoadLibraryA("IamDLL") success!" ;
     7  
     8         //使用GetProcAddress,获取指向要调用的导出函数的函数指针
     9         LPFN_MULT pDoMult = (LPFN_MULT)GetProcAddress(hDll, ("DoMult"));
    10         if(pDoMult)
    11         {
    12             qDebug() << "LoadLibraryA pDoMult: " << pDoMult(12, 3);
    13         }
    14         //
    15         LPFN_DIV pDoDiv = (LPFN_DIV)GetProcAddress(hDll, ("DoDiv"));
    16         if(pDoDiv)
    17         {
    18             qDebug() << "LoadLibraryA pDoDiv: " << pDoDiv(35, 5);
    19         }
    20         //
    21         LPFN_LOGIN pDoLogin = (LPFN_LOGIN)GetProcAddress(hDll, ("DoLogin"));
    22         if(pDoLogin)
    23         {
    24             qDebug() << "LoadLibraryA pDoLogin: " << pDoLogin("kandy", "admin").data();
    25         }
    26         FreeLibrary(hDll);
    27     }

    二、QLibrary方式

     1 //方法贰:QLibrary方式
     2     QLibrary qlib("IamDLL");
     3     if(qlib.load())
     4     {
     5         qDebug() << "
    ";
     6         qDebug() << "qlib.load() success!" ;
     7         LPFN_MULT pDoMult = (LPFN_MULT)qlib.resolve("DoMult");
     8         if(pDoMult)
     9         {
    10             qDebug() << "qlib.load() pDoMult: " << pDoMult(12, 2);
    11         }
    12         //
    13         LPFN_DIV pDoDiv = (LPFN_DIV)qlib.resolve("DoDiv");
    14         if(pDoDiv)
    15         {
    16             qDebug() << "qlib.load() pDoDiv: " << pDoDiv(35, 7);
    17         }
    18         //
    19         LPFN_LOGIN pDoLogin = (LPFN_LOGIN)qlib.resolve("DoLogin");
    20         if(pDoLogin)
    21         {
    22             qDebug() << "qlib.load() pDoLogin: " << pDoLogin("zhouwei", "abc123").data();
    23         }
    24         qlib.unload();
    25     }

    三、静态链接的方式

    1 //方法叁:使用静态链接方式(将IamDll生成的libIamDLL.a导入到本工程)
    2     qDebug() << "
    ";
    3     IamDLL _IamDLL;
    4     qDebug() << "IamDLL.add : " << _IamDLL.add(121, 123);
    5  
    6     qDebug() << "DoMult : " << DoMult(12, 12);
    7     qDebug() << "DoDiv : " << DoDiv(121, 11);
    8     qDebug() << "DoLogin : " << DoLogin("hello", "test").data();
  • 相关阅读:
    OCP 062【中文】考试题库(cuug内部资料)第13题
    OCP 062【中文】考试题库(cuug内部资料)第12题
    560. 和为K的子数组 力扣(中等) 字节面试题,不会,前缀和,hash,有尺取法的味道
    863. 二叉树中所有距离为 K 的结点 力扣(中等) bfs
    671. 二叉树中第二小的节点 力扣(简单) auto循环set
    1713. 得到子序列的最少操作次数 力扣(困难) 最长公共子序列->最长上升子序列 lower(vector) 得迭代器
    47. 全排列 II 力扣(中等) 手写练习
    328. 奇偶链表 力扣(中等) 链表练习
    21. 合并两个有序链表 力扣(简单) 链表练习
    1743. 从相邻元素对还原数组 力扣(中等) 需要思考但可以做,hash
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14188251.html
Copyright © 2011-2022 走看看