精华内容
下载资源
问答
  • QT调用dll

    2016-06-18 18:39:59
    Qt调用dll中的功能函数 声明: 事先我已经自己动手写了一个简单的dll文件(myDLL.dll),C版接口的。并且用我前两篇有关DLL文章里面的方法,从dll中导出了导入库(.lib)文件,dll中有两个函数,原型如下:  void ...

    Qt调用dll中的功能函数

    声明: 事先我已经自己动手写了一个简单的dll文件(myDLL.dll),C版接口的。并且用我前两篇有关DLL文章里面的方法,从dll中导出了导入库(.lib)文件,dll中有两个函数,原型如下:

       void HelloWorld();     //函数内部调用Win32 API,功能是弹出一个helloworld提示框
       int add(int a,int b);  //实现两个数相加,并返回结果

     下面分别通过显示调用和隐式调用两种方法,来模拟Qt如何调用外部dll文件中的功能函数,follow me....

     

    预备知识:

         1、如果在没有导入库文件(.lib),而只有头文件(.h)与动态链接库(.dll)时,我们才需要显示调用,如果这三个文件都全的话,我们就可以使用简单方便的隐式调用。

         2、通常Windows下程序显示调用dll的步骤分为三步(三个函数):LoadLibrary()、GetProcAdress()、FreeLibrary()

     其中,LoadLibrary() 函数用来载入指定的dll文件,加载到调用程序的内存中(DLL没有自己的内存!)

             GetProcAddress() 函数检索指定的动态链接库(DLL)中的输出库函数地址,以备调用

             FreeLibrary() 释放dll所占空间 

     

    1、显示调用 

          Qt提供了一个 QLibrary 类供显示调用。下面给出一个完整的例子:

    #include <QApplication>
    #include <QLibrary>
    #include <QDebug>
    #include <QMessageBox>
    #include "dll.h"             //引入头文件
    typedef int (*Fun)(int,int); //定义函数指针,以备调用
    int main(int argc,char **argv)
    {
        QApplication app(argc,argv);
        QLibrary mylib("myDLL.dll");   //声明所用到的dll文件
        int result;
        if (mylib.load())              //判断是否正确加载
        {
            QMessageBox::information(NULL,"OK","DLL load is OK!");
            Fun open=(Fun)mylib.resolve("add");    //援引 add() 函数
            if (open)                  //是否成功连接上 add() 函数
            {
                QMessageBox::information(NULL,"OK","Link to Function is OK!");
                result=open(5,6);      //这里函数指针调用dll中的 add() 函数
                qDebug()<<result;
            }
            else
                QMessageBox::information(NULL,"NO","Linke to Function is not OK!!!!");
        }
        else
            QMessageBox::information(NULL,"NO","DLL is not loaded!");
            return 0;  //加载失败则退出28}


     myDLL.dll为自定义的dll文件,将其复制到程序的输出目录下就可以调用。显然,显示调用代码书写量巨大,实在不方便。

     

    2、隐式调用

        这个时候我们需要三个文件,头文件(.h)、导入库文件(.lib)、动态链接库(.dll),具体步骤如下:

    1、首先我们把 .h 与 .lib/.a 文件复制到程序当前目录下,然后再把dll文件复制到程序的输出目录,

    2、下面我们在pro文件中,添加 .lib 文件的位置: LIBS+= -L D:/hitempt/api/ -l myDLL

    或者LIBS += -L ./ -lmyDLL

             -L 参数指定 .lib/.a 文件的位置

             -l  参数指定导入库文件名(不要加扩展名) 

             另外,导入库文件的路径中,反斜杠用的是向右倾斜的 

    3、在程序中include头文件(我试验用的dll是用C写的,因此要用 extern "C" { #include "dll.h" } )

     下面是隐式调用的实例代码:

    #include <QApplication>
    #include <QDebug>
    extern "C"    //由于是C版的dll文件,在C++中引入其头文件要加extern "C" {},注意
    {
            #include "dll.h"
    }
    int main(int argv ,char **argv)
    {
           QApplication app(argv,argv);
           HelloWordl();          //调用Win32 API 弹出helloworld对话框
           qDebug()<<add(5,6);    // dll 中我自己写的一个加法函数
           return 0;  //完成使命后,直接退出,不让它进入事件循环
    }


    还是隐式调用方便啊,直接就可以调用dll中的函数..

    展开全文
  • Qt调用DLL

    2020-04-19 16:39:20
    同一编译器同一版本QT调用Qt自己写的DLL(隐式调用)。 一、Qt调用程序和DLL不在同一项目 1.创建Qt控制台应用程序 2.添加库->外部库->选择外部库的文件路径,确认Lib库加载的路径。加载完成后.pro文件中会...

    概述

    同一编译器同一版本QT调用Qt自己写的DLL(隐式调用)。

    一、Qt调用程序和DLL不在同一项目

    1.创建Qt控制台应用程序

    2.添加库->外部库->选择外部库的文件路径,确认Lib库加载的路径。加载完成后.pro文件中会增加如下代码。

    3.添加头文件将DLL的头文件添加至项目中。建议先将头文件复制到项目文件夹中。

     

    4. 将.dll文件复制到..\build-appTest-Desktop_Qt_5_9_7_MSVC2017_64bit-Debug\debug或者..\build-appTest-Desktop_Qt_5_9_7_MSVC2017_64bit-Debug\release目录中。否则DLL调用不起来。

    5.main.cpp中引入头文件。如下图所示。

    6.使用,由于导出的DLL是类,DLL的调用如下图所示。

    7.运行

     二、QT调用程序和DLL在同一项目中。

    1.新建项目->其它项目->子目录项目...至完成。.pro中如图所示。

    2.在该项目下新建一个mainApp调用程序。

    3.载该项目下创建一个DLL。

    4.编写DLL的代码。

    5.编译DLL代码,.dll文件复制到..\build-appTest-Desktop_Qt_5_9_7_MSVC2017_64bit-Debug\debug或者..\build-appTest-Desktop_Qt_5_9_7_MSVC2017_64bit-Debug\release目录中。

    6.在mainApp中添加内部库,完成添加后会在mainApp.pro中增加如下代码。

    7.在mainApp的主函数中引入头文件。

    8.调用DLL,如下图。

    9.运行

    三、注意

    DLL       如果DLL加载失败,一般是由于位数、编译器、或者该DLL依赖其他库(或者其他DLL)导致的。不是什么DLL都可以拿来直接使用 。 

     

    展开全文
  • 编写QT的dllQT调用QT的dllQT调用外部的dll,MFC程序调用QT的dll
  • Qt调用dll

    千次阅读 2018-09-23 17:23:43
    DLLSHARED_EXPORT Dll* getDllObject(); //获取类Dll的对象 DLLSHARED_EXPORT void releseDllObject(Dll*); //获取类Dll的对象 DLLSHARED_EXPORT void helloWorld(); DLLSHARED_EXPORT int add(int a,int b);.....

    直接上代码

    extern "C"{
    DLLSHARED_EXPORT Dll* getDllObject(); //获取类Dll的对象
    DLLSHARED_EXPORT void releseDllObject(Dll*); //获取类Dll的对象
    
    DLLSHARED_EXPORT void helloWorld();
    DLLSHARED_EXPORT int add(int a,int b);
    }
    
    #include "mainwindow.h"
    #include <QApplication>
    #include <iostream>
    #include <QLibrary>
    #include <windows.h>
    #include "dll.h"  //头文件还是需要加的,否则无法解析Dll类
    
    typedef Dll* (*CreatDll)();//定义函数指针,获取类Dll对象;
    typedef bool (*ReleseDll)(Dll*);
    typedef void (*fun)();
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
    
        QLibrary mylib("dll.dll");   //声明所用到的dll文件
        //判断是否正确加载
        if (mylib.load())
        {
            std::cout << "DLL  loaded!"<<std::endl;
            CreatDll creatDll = (CreatDll)mylib.resolve("getDllObject");
            ReleseDll decDll=(ReleseDll)mylib.resolve ("releseDllObject");
            fun hello=(fun)mylib.resolve ("helloWorld");
            if(hello)hello();
            if(creatDll&&decDll)
            {
                Dll *testDll = creatDll();
                testDll->GetStrAdd ("abc","ABD");
                testDll->Print ();
                decDll(testDll);
            }
        }
        //加载失败
        else
            std::cout << "DLL is not loaded!"<<std::endl;
    
        mylib.unload ();
    
        return a.exec();
    }
    

    工程文件加入

    #LIBS += "D:/qt_work/build-dllTest-Desktop_Qt_5_11_1_MinGW_32bit-Debug/debug/dll.dll" 或者
    LIBS += D:\qt_work\build-dllTest-Desktop_Qt_5_11_1_MinGW_32bit-Debug\debug\dll.dll
    

    否则会报错:

    D:\qt_work\build-dllTest-Desktop_Qt_5_11_1_MinGW_32bit-Debug\debug\main.o:-1: In function
      `Z5qMainiPPc':
    D:\qt_work\dllTest\main.cpp:30: error: undefined reference to
      `_imp___ZN3Dll9GetStrAddENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_'
    D:\qt_work\dllTest\main.cpp:31: error: undefined reference to `_imp___ZN3Dll5PrintEv'
    
    展开全文
  • qt 调用dll

    2014-06-05 22:42:51
    声明: 事先我已经自己动手写了一个简单的dll文件(myDLL.dll),C版接口的。并且用我前两篇有关DLL文章里面的方法... //函数内部调用Win32 API,功能是弹出一个helloworld提示框  int add(int a,int b); //实现两个

    声明: 事先我已经自己动手写了一个简单的dll文件(myDLL.dll),C版接口的。并且用我前两篇有关DLL文章里面的方法,从dll中导出了导入库(.lib)文件,dll中有两个函数,原型如下:

       void HelloWorld();     //函数内部调用Win32 API,功能是弹出一个helloworld提示框
       int add(int a,int b);  //实现两个数相加,并返回结果

     下面分别通过显示调用和隐式调用两种方法,来模拟Qt如何调用外部dll文件中的功能函数,follow me....

     

    预备知识:

         1、如果在没有导入库文件(.lib),而只有头文件(.h)与动态链接库(.dll)时,我们才需要显示调用,如果这三个文件都全的话,我们就可以使用简单方便的隐式调用。

         2、通常Windows下程序显示调用dll的步骤分为三步(三个函数):LoadLibrary()、GetProcAdress()、FreeLibrary()

     其中,LoadLibrary() 函数用来载入指定的dll文件,加载到调用程序的内存中(DLL没有自己的内存!)

             GetProcAddress() 函数检索指定的动态链接库(DLL)中的输出库函数地址,以备调用

             FreeLibrary() 释放dll所占空间 

     

    1、显示调用 

          Qt提供了一个 QLibrary 类供显示调用。下面给出一个完整的例子:

    复制代码
     1 #include <QApplication>
     2 #include <QLibrary>
     3 #include <QDebug>
     4 #include <QMessageBox>
     5 #include "dll.h"             //引入头文件
     6 typedef int (*Fun)(int,int); //定义函数指针,以备调用
     7 int main(int argc,char **argv)
     8 {
     9     QApplication app(argc,argv);
    10     QLibrary mylib("myDLL.dll");   //声明所用到的dll文件
    11     int result;
    12     if (mylib.load())              //判断是否正确加载
    13     {
    14         QMessageBox::information(NULL,"OK","DLL load is OK!");
    15         Fun open=(Fun)mylib.resolve("add");    //援引 add() 函数
    16         if (open)                  //是否成功连接上 add() 函数
    17         {
    18             QMessageBox::information(NULL,"OK","Link to Function is OK!");
    19             result=open(5,6);      //这里函数指针调用dll中的 add() 函数
    20             qDebug()<<result;
    21         }
    22         else
    23             QMessageBox::information(NULL,"NO","Linke to Function is not OK!!!!");
    24     }
    25     else
    26         QMessageBox::information(NULL,"NO","DLL is not loaded!");

    27         return 0;  //加载失败则退出

    28}

    复制代码

     myDLL.dll为自定义的dll文件,将其复制到程序的输出目录下就可以调用。显然,显示调用代码书写量巨大,实在不方便。

     

    2、隐式调用

        这个时候我们需要三个文件,头文件(.h)、导入库文件(.lib)、动态链接库(.dll),具体步骤如下:

    1、首先我们把 .h 与 .lib/.a 文件复制到程序当前目录下,然后再把dll文件复制到程序的输出目录,

    2、下面我们在pro文件中,添加 .lib 文件的位置: LIBS+= -L D:/hitempt/api/ -l myDLL

             -L 参数指定 .lib/.a 文件的位置

             -l  参数指定导入库文件名(不要加扩展名) 

             另外,导入库文件的路径中,反斜杠用的是向右倾斜的 

    3、在程序中include头文件(我试验用的dll是用C写的,因此要用 extern "C" { #include "dll.h" } )

     下面是隐式调用的实例代码:

    复制代码
     1 #include <QApplication>
     2 #include <QDebug>
     3 extern "C"    //由于是C版的dll文件,在C++中引入其头文件要加extern "C" {},注意
     4 {
     5         #include "dll.h"
     6 }
     7 int main(int argv ,char **argv)
     8 {
     9        QApplication app(argv,argv);
    10        HelloWordl();          //调用Win32 API 弹出helloworld对话框
    11        qDebug()<<add(5,6);    // dll 中我自己写的一个加法函数
    12        return 0;  //完成使命后,直接退出,不让它进入事件循环
    13 }
    复制代码

    还是隐式调用方便啊,直接就可以调用dll中的函数...

    展开全文
  • Qt调用dll的隐式调用

    千次阅读 2018-11-09 12:50:36
    Qt调用dll的隐式调用 一、前言: Qt调用dll的例子,在网上找了很多个,始终由于自己对Qt不熟的原因总是 失败(本人一直使用vs开发,由于工程上要提供sdk给Qt工程师调用导致各种问题),经过一番折腾终于可以实现...
  • QT调用DLL功能

    2015-05-10 20:36:46
    Qt 调用 DLL功能函数是本文要介绍的内容,DLL 是一个包含可由多个程序同时使用的代码和数据的库
  • Qt调用DLL方法一:使用Win32 APIh文件typedef bool (CALLBACK* SetKeyBoardHook)(HWND);HINSTANCE hDLL; // Handle to DLLSetKeyBoardHook lpfnDllFunc1; // Function pointercpp文件void MainWindow::test(){hDLL =...
  • QT调用dll、外部程序调用QT的dll.md

    千次阅读 2017-11-26 22:27:23
    QT调用外部的dll: 直接使用 QLibrary::load() 加载dll,使用 QLibrary::resolve() 查找函数地址加载函数即可。 QT调用QT的dll: 新建子目录项目: 添加子项目: 添加 Application 工程,然后把除了main.cpp...
  • VS生成dll 在需要导出给外部调用的函数或者类前面加关键字__declspec(dllexport);...Qt调用dll的方法 把dll复制到.exe所在目录; 把lib复制到一个自己定义的目录; 把.h文件复制到一个自己定义的目
  • QT 调用 DLL 方法

    2015-01-16 16:44:53
    Qt调用DLL方法一:使用Win32 API 在显式链接下,应用程序必须进行函数 调用以在运行时显式加载 DLL。为显式链接到 DLL,应用程序必须: ? 调用 LoadLibrary(或相似的函 数)以加载 DLL 和获取模块句柄。 ? 调用...
  • Qt调用DLL方法一:使用Win32 API在显式链接下,应用程序必须进行函数 调用以在运行时显式加载 DLL。为显式链接到 DLL,应用程序必须:? 调用 LoadLibrary(或相似的函 数)以加载 DLL 和获取模块句柄。? 调用 ...
  • Qt调用DLL方法一:使用Win32 API h文件 typedef bool (CALLBACK* SetKeyBoardHook)(HWND); HINSTANCE hDLL; // Handle to DLL SetKeyBoardHook lpfnDllFunc1; // Function pointer cpp文件 ...
  • QT调用DLL库小结

    千次阅读 2016-10-26 14:41:41
    QT调用DLL库小结: 背景: QT调用在vs下编译的DLL文件。 1. QT隐式调用失败,需要用QLibrary类显示调用才能成功。 2. 使用std::string传参,到dll里面就乱码了。需要使用char *来传参。 暂时就先总结这两点...
  • QT 调用 DLL 方法(三种方法)

    万次阅读 热门讨论 2018-09-03 15:26:09
    Qt调用DLL方法一:使用Win32 API  h文件 typedef bool (CALLBACK* SetKeyBoardHook)(HWND); HINSTANCE hDLL; // Handle to DLL SetKeyBoardHook lpfnDllFunc1; // Function pointer cpp文件 void MainWindow:...
  • 详解 Qt 调用 DLL功能函数

    千次阅读 2013-07-27 22:06:28
    本文介绍的是详解 Qt 调用 DLL功能函数,DLL 是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。先来看内容。 AD: 2013云计算架构师峰会超低价抢票中 Qt 调用 DLL功能函数是本文要介绍...
  • QT调用dll中的函数,3种方式demo, 1、采用显示链接,调用DLL中全局函数 2、采用显示链接,调用C++类中的类对象、成员函数 3、采用隐式链接方法,通过QLibrary类对DLL中类对象、全局函数的调用
  • Qt调用dll中的功能函数

    千次阅读 2016-09-14 14:47:51
    Qt调用dll中的功能函数声明: 事先我已经自己动手写了一个简单的dll文件(myDLL.dll),C版接口的。并且用我前两篇有关DLL文章里面的方法,从dll中导出了导入库(.lib)文件,dll中有两个函数,原型如下:void HelloWorld...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,089
精华内容 435
关键字:

qt调用dll