QT创建与调用Dll方法(包括类成员)--显式调用

看网上的好多关于QT调用Dll的方法,大部分都是调用函数的,并没有调用C++类成员的情况,即使是有,比如说:

使用Qt编写模块化插件式应用程序

Qt 一步一步实现dll调用(附源码)---(这一篇里没有调用类成员的)

Qt调用dll中的功能函数

?我就是按照这上面的教程一步步做的,可惜了都没成功~~~这里面都有一个最重要的步骤没有说清楚(可能怪我笨~~),路径问题!!!

所以这里自我做一下总结:

创建时选择C++ Library就可以了,然后选择Shared Library(共享库),其他默认OK。

创建好后文件如下(我这里工程名为:dll)

其中dll.pro代码为:


1

2

3

4

5

6

7

8

9

10

11

12

TARGET = dll

TEMPLATE = lib

DEFINES += DLL_LIBRARY

SOURCES += \

    dll.cpp

HEADERS +=\

        dll_global.h \

    dll.h

unix {

    target.path = /usr/lib

    INSTALLS += target

}

dll_global.h代码为:


1

2

3

4

5

6

7

8

9

#ifndef DLL_GLOBAL_H

#define DLL_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(DLL_LIBRARY)

#  define DLLSHARED_EXPORT Q_DECL_EXPORT

#else

#  define DLLSHARED_EXPORT Q_DECL_IMPORT

#endif

#endif // DLL_GLOBAL_H

dll.h代码为:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#ifndef DLL_H

#define DLL_H

#include <string>

#include "dll_global.h"

using namespace std;

class DLLSHARED_EXPORT Dll

{

public:

    Dll();

    ~Dll();

    void Print();

    string GetStrAdd(string str1, string str2);

};

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);

}

#endif // DLL_H

dll.cpp代码为:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

#include "dll.h"

#include <iostream>

Dll::Dll()

{

    std::cout<<"New Dll Object !"<<endl;

}

Dll::~Dll(){

    std::cout<<"Dll Object Des~~"<<endl;

}

void Dll::Print ()

{

    std::cout<<"Dll::Print !"<<endl;

}

string Dll::GetStrAdd (string str1, string str2)

{

    string s=str1+str2;

    std::cout<<"Dll::GetStrAdd->return->"<<s<<endl;

    return (s);

}

void helloWorld()

{

    std::cout << "GlobalFun->hello,world!"<<endl;

}

int add(int a,int b)

{

    std::cout<<"GlobalFun->add->return->"<<(a+b)<<endl;

    return a + b;

}

Dll* getDllObject()

{

    return new Dll();

}

void releseDllObject(Dll* dll){

    delete dll;

}

运行后在生成目录里生成了dll.dll、libdll.a、dll.o三个文件(Windows下使用MinGW编译运行),如图:

新建一个调用项目”DllTest“:

将dll.h和dll_global.h两个文件放到代码目录中:

其中DllTest.pro代码如下:


1

2

3

4

5

6

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = DllTest

TEMPLATE = app

SOURCES += main.cpp

LIBS +=dll.dll       #很重要!路径设置问题,如果错了就没有如果了~~~

LIBS +=”D:/API/dll.dll"   #~Right!


1

2

3

4

5

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = DllTest

TEMPLATE = app

SOURCES += main.cpp

LIBS +=dll.dll       #很重要!路径设置问题,如果错了就没有如果了~~~

main.cpp代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

//#include <QtCore/QCoreApplication>

#include <iostream>

#include <QLibrary>

#include "dll.h"  //头文件还是需要加的,否则无法解析Dll类

typedef Dll* (*CreatDll)();//定义函数指针,获取类Dll对象;

typedef bool (*ReleseDll)(Dll*);

typedef void (*fun)();

int main( )

{

//    QCoreApplication a(argc, argv);

    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;

//    return a.exec();

    mylib.unload ();

    return 0;

}

//输出为:

DLL  loaded!

GlobalFun->hello,world!

New Dll Object !

Dll::GetStrAdd->return->abcABD

Dll::Print !

Dll Object Des~~

这里将dll.dll文件放到调用项目的生成目录下(Debug上面一层)即DllTest-Debug(我这里是这个名字,你那里可能不同)目录下:

编译,运行,OK!

这里要特别注意dll.dll的存放位置,还有要在.pro文件中增加一个 LIBS += dll.dll 用来指示路径,也可使用绝对路径如先将dll.dll放到D:/API/下,则应该设置为:LIBS += "D:/API/dll.dll"

如果想在资源管理器中直接双击exe文件打开,则dll.dll要放到和exe同目录下!

这个是显式调用的方法!

代码下载 http://download.csdn.net/detail/lomper/8183207

说明:下载的代码下载好后,要将LIBS += "D:/API/dll.dll" 更改成:LIBS += dll.dll 就可直接运行了。(项目DllTest.pro)

来自为知笔记(Wiz)

时间: 2024-10-13 00:28:49

QT创建与调用Dll方法(包括类成员)--显式调用的相关文章

QT 调用 DLL 方法(三种方法)

Qt调用DLL方法一:使用Win32 API 在显式链接下,应用程序必须进行函数 调用以在运行时显式加载 DLL.为显式链接到 DLL,应用程序必须:? 调用 LoadLibrary(或相似的函 数)以加载 DLL 和获取模块句柄.? 调用 GetProcAddress,以获 取指向应用程序要调用的每个导出函数的函数指针.由于应用程序是通过指针调用 DLL 的函数,编译器不生成外部引 用,故无需与导入库链接.? 使用完 DLL 后调用 FreeLibrary.例如:typedef UINT (C

LoadRunner 调用dll方法

本文主要介绍简单DLL的编写方法及在LoadRunner中局部调用与全局调用DLL方法. 1.动态链接库的编写 在Visual C++6.0开发环境下,打开FileNewProject选项,可以选择Win32 Dynamic-Link Library建立一个空的DLL工程. DLL必须有一个入口点,这就象C语言MAIN函数一样.在Non-MFC DLL中DllMain是一个缺省的入口函数,你不需要编写自己的DLL入口函数,用这个缺省的入口函数就能使动态链接库被调用时得到正确的初始化.如果应用程序

Java编译时根据调用该方法的类或对象所属的类决定

class Base{ ????int x = 1; ????static int y = 2; } class Subclass extends Base{ ????int x = 4; ????int y = 5; } public class Test02{ ????public static void main(String[] args){ ????????Subclass s = new Subclass(); ????????System.out.println(s.x+" &qu

继承和动态内存分配——需要为继承类定义 显式析构函数、复制构造函数和赋值运算符

当派生类使用了new时,必须为派生了定义显式析构函数.复制构造函数和赋值运算符.(这里假设hasDMA类继承自baseDMA类)显式析构函数: baseDMA::~baseDMA() // takes care of baseDMA stuff { delete [] label; } hasDMA::~hasDMA() { delete [] style; } 复制构造函数: baseDMA::baseDMA(const baseDMA & rs) { label = new char[std

go语音之进阶篇显式调用panic函数

1.显式调用panic函数 示例: package main import "fmt" func testa() { fmt.Println("aaaaaaaaaaaaaaaaa") } func testb() { //fmt.Println("bbbbbbbbbbbbbbbbbbbb") //显式调用panic函数,导致程序中断 panic("this is a panic test") } func testc() {

父类不含无参构造方法子类构造方法必须显式调用

一直不知道怎么取这个标题... 前两天发现我父类中定义了一个带参构造方法,然后子类继承后构造方法必须先调用父类方法带参构造方法,方法调用为super(参数,...). 然后我就上网查,可能关键字没搞对..哈哈...一直没明白,后来发现,如果父类含有不带参构造方法,那么子类就不需要上述操作. 那么为什么呢? 先说下类实例化的过程,也就是new一个对象的时候 首先默认运行的是类中无参的构造方法(这个可能在实例化过程java会为每一个类自动创建的),这是java默认首先运行的: 当然如果你重写无参的了

C# 通过反射类动态调用DLL方法

网上看了很多关于反射的思路和方法,发现这个还算不错 //使用反射方: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { //声明一个反射类对象 Assembly a

分页方法,类(以后直接调用)

<?php /** file: page.class.php 完美分页类 Page */ class Page { private $total; //数据表中总记录数 private $listRows; //每页显示行数 private $limit; //SQL语句使用limit从句,限制获取记录个数 private $uri; //自动获取url的请求地址 private $pageNum; //总页数 private $page; //当前页 private $config = arr

【转】QT创建子对话框的方法

原文地址:http://blog.csdn.net/baidu_18991997/article/details/42713159 代码实现功能:单击某个按钮后,弹出对话框,对话框中的内容可自行设计. 1.建立一个主界面,主界面中有一个pushbotton按键. 2.右键项目->添加新文件->Qt设计师界面类 Part II--对话框的模态和非模态 1.  建立一个对话框类: 2.  对话框中放置pushbutton和TextEdit: 3.  转到主窗口菜单栏New Window的槽: 4.