QT5编写和调用DLL动态库的终极实践
DLL编写和调用详细教程(附过程截图)
1.新建一个 Dll 工程,工程名 MyDll 步骤 Win 程序-> DLL -> 完成 会自动生成一个 MyDll.cpp、dllmain.cpp、stdafx.cpp、 targetver.h、stdafx.h 共个文件 在创建 Dll 工程中,勾选导出符号,会自动添加 MyDll.h
这里需要 lib 文件,不选择删除操作
5.新建调用工程,调整依赖关系、启动项 右键 MyDll 解决方案->添加->新建项目这里选择常见默认的 Win32 控制台应用程序 右键调用 Dll 函数->项目依赖项->勾选 MyDll,在右键设置为启动项目
6.调用 dll 的内部函数 写入以下代码 // 调用 Dll 函数.cpp : 定义控制台应用程序的入口点。 #pragma comment (lib,"MyDll.lib")
2015 年 5 月 15 日星期五
()那如何生成 lib 文件呢? 也是右键解决方案,添加-> 新建项,选择 m 模块定义文件(.def) 在编译一次就生成了 lib 文件,还有 MyDll.dll 文件
()取消 lib 文件的生成 在解决方案的属性中->配置属性->链接器->输入-def 在重新编译就可以了。
#ifdef MYLIBDLL #define MYLIBDLL extern "C" _declspec(dllimport) #else #define MYLIBDLL extern "C" _declspec(dllexport) #endif //这里就定义了一个函数 add MYLIBDLL int Add(int one, int two); MYLIBDLL int Mul(int one, int two); */ #endif 这里还有非常关键的一步,就在 MyDll.cpp 中添加头文件 #include "MyDll.h"//这一句别忘记了,否则后面调用函数编译不了
QT调用DLL方法(三种方法)
QT调⽤DLL⽅法(三种⽅法)Qt调⽤DLL⽅法⼀:使⽤Win32 API在显式链接下,应⽤程序必须进⾏函数调⽤以在运⾏时显式加载 DLL。
为显式链接到 DLL,应⽤程序必须:调⽤ LoadLibrary(或相似的函数)以加载 DLL 和获取模块句柄。
调⽤ GetProcAddress,以获取指向应⽤程序要调⽤的每个导出函数的函数指针。
由于应⽤程序是通过指针调⽤ DLL 的函数,编译器不⽣成外部引⽤,故⽆需与导⼊库链接。
使⽤完 DLL 后调⽤ FreeLibrary。
例如:typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);HINSTANCE hDLL; // Handle to DLLLPFNDLLFUNC1 lpfnDllFunc1; // Function pointerDWORD dwParam1;UINT uParam2, uReturnVal;hDLL = LoadLibrary(”MyDLL”);if (hDLL != NULL){lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,“DLLFunc1″);if (!lpfnDllFunc1){// handle the errorFreeLibrary(hDLL);return SOME_ERROR_CODE;}else{// call the functionuReturnVal = lpfnDllFunc1(dwParam1, uParam2);}}需要说明的是,typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);是声明想要调⽤的函数指针,这个函数的参数必须和DLL⾥⾯的⼀样。
DLLFunc1是DLL⾥⾯的“实际的函数名”,必须和头⽂件⾥⾯声明的⼀样,否则将会调⽤失败。
使⽤需要加Windows.h 头⽂件。
QT自定义工程封装成DLL,并在另一个QT程序中使用
QT⾃定义⼯程封装成DLL,并在另⼀个QT程序中使⽤⾸先新建⼀个Library⼯程命名为WidgetLib ,之后就默认下⼀步即可,如果需要添加额外的模块,可以在.pro⽂件中语句QT += 后⾯⾃⼰添加⼯程新建之后⽂件列表如下所⽰此时的⽂件中还没有ui⽂件,如果要封装带界⾯的动态库,需要右键点击⼯程->add new在新弹出的窗⼝中选择Qt -> Qt设计师界⾯类将其命名为与当前⼯程相同的名字,以覆盖之前不带ui界⾯的⽂件。
之后会弹出如下两个窗⼝,分别点击OK 和 Yes to All此时可以看到新的⼯程⽂件下⾯多出了 .ui⽂件不过此时的⼯程还不能直接打包成动态库,因为旧的⽂件被覆盖掉了,新的⽂件⽆法打包成动态库,因此需要对新的⽂件进⾏修改此时新的widgetlib.h⽂件内容如下#ifndef WIDGETLIB_H#define WIDGETLIB_H#include <QWidget>namespace Ui {class WidgetLib;}class WidgetLib : public QWidget{Q_OBJECTpublic:explicit WidgetLib(QWidget *parent = nullptr);~WidgetLib();private:Ui::WidgetLib *ui;};#endif// WIDGETLIB_H需要将其修改为下⾯的内容#ifndef WIDGETLIB_H#define WIDGETLIB_H#include <QWidget>#include "widgetlib_global.h"namespace Ui {class WidgetLib;}class WIDGETLIBSHARED_EXPORT WidgetLib : public QWidget{Q_OBJECTpublic:explicit WidgetLib(QWidget *parent = nullptr);~WidgetLib();private:Ui::WidgetLib *ui;};#endif// WIDGETLIB_H即:需要添加头⽂件 #include "widgetlib_global.h" 以及在类名前添加 WIDGETLIBSHARED_EXPORT 语句。
VS使用QT5.2.1动态库的方法
VS使用QT5.2.1动态库的方法使用QT创建项目需更改VS2013配置,操作步骤如下:1、打开VS2013,点击菜单栏中“QT5”->选择“Qt Option”,弹出如下窗口:2、添加QT静态库文件路径,并选择对应版本。
2、单击“QT5”->选择“Qt Project ”,弹出如下窗口,选择Version为静态库版本。
3、右键QT项目,选择“属性” 弹出如下窗口:如图上红框所示,配置该选项。
4、右键QT项目,选择“属性”,弹出如下窗口:如图红框所示配置信息,【附加依赖项】配置为:PocoFoundationd.lib;AfcFrameworkd.lib;DevBased.lib;imm3 2.lib;winmm.lib;Ws2_32.lib;opengl32.lib;qwindowsd.lib;Qt5PlatformSupportd.lib;wsock32.lib;qtm aind.lib;Qt5Cored.lib;Qt5Guid.lib;Qt5Widgetsd.lib;%(AdditionalDependencies)5、右键QT项目,选择“属性”,弹出如下窗口:如图红框所示配置信息,【附加库目录】配置为:$(QTDIR)\plugins\platforms;$(QTDIR)\lib;%(AdditionalLibrar yDirectories)6、QT项目启动cpp中加入如下:如图红框代码:#include#include"Poco/Foundation.h"#ifdef POCO_OS_FAMILY_WINDOWSQ_IMPORT_PLUGIN( QWindowsIntegrationPlugin ); #endif。
QT生成动态链接库及调用详细步骤
QT⽣成动态链接库及调⽤详细步骤
1. ⾸先新建⼀个⼯程(该篇⽂章共有两个不同的⼯程,注意区分,⼀个是有UI界⾯的,⼀个是没有UI界⾯的)
2.接下来选择库模板
3.选择共享库,取个该动态链接库的名字,下⼀步
5.继续下⼀步,直到点击完成。
6.点击项⽬,勾掉Shadow build,使.dll不⽣成在debug⽬录中,⽣成在我们⾃⼰创建的⽬录下⾯,⽅便查找和使⽤。
7.在.pro⽂件中,添加如下代码
DESTDIR =..\MyDebug
使⽣成的.dll⽂件放在该⽬录下,⾃动创建该⽬录。
8.点击运⾏,即可⽣成。
(此弹框不⽤管它,代表编译成功,已⽣成⽂件)
9.调⽤⽅法有两种:
(1)在.pro⽂件中,添加如下代码,并将Save_Data.h 添加到⼯程项⽬中(这步应该都会,添加现有⽂件),需要⽤到该动态链接库的地⽅就 #include 进去。
需要注意的⼀点就是:需要把以上⽣成的⽂件放置到⽣成的E:\cpptest\build-test_dll-
Desktop_Qt_5_7_0_MinGW_32bit-Debug\debug ⽬录下。
LIBS += libgdi32#这个也不能少。
少了会出错
win32:LIBS += "E:/cpptest/MyDebug/Save_Data.dll"
win32:LIBS+= -LE:/cpptest/MyDebug/ -lSave_Data
(2)在.pro⽂件中,添加如下代码,并将Save_Data.h ⽂件放置在与⼯程⽂件同⽬录⽂件中,需要⽤到该动态链接库的地⽅就 #include 进去。
⽐如我的,看图⼀⽬了然:。
QTCreator调用动态库实例讲述
在linux中,qt里面已经集成了最新的开发平台QT Creator,下面是我练习调用动态库(.so文件)的例程:1、打开QT Creator,点击File-》New...菜单,选择C++ Libarary工程,点击下一步,输入工程名称(本例为zsz)即可,这没什么可说的。
工程文件(.pro)程序清单# -------------------------------------------------# Project created by QtCreator 2009-03-02T10:09:35# -------------------------------------------------TARGET = zszTEMPLATE = libCONFIG += pluginDEPENDPATH += .INCLUDEPATH += .SOURCES += mylib.cppHEADERS += mylib.hmylib.h文件程序清单:#ifndef MYLIB_H#define MYLIB_H#ifdef Q_WS_WIN //表示在windows环境#define MY_EXPORT __declspec(dllexport)#else#define MY_EXPORT#endifclass mylib {public:int mymax(int i, int j);int add(int i, int j);};extern "C" MY_EXPORT int diff(int i, int j);#endif // MYLIB_Hmylib.cpp文件程序清单:#include "mylib.h"extern "C" MY_EXPORT int mylib::mymax(int i,int j){if(i>=j)return i;elsereturn j;}extern "C" MY_EXPORT int mylib::add(int i,int j){return i+j;}extern "C" MY_EXPORT int diff(int i, int j){if(i>=j)return i-j;elsereturn j-i;}对该工程进行编译,生成libzsz.so文件。
Qt下开发及调用带界面的DLL
Qt下开发及调⽤带界⾯的DLL0.背景由于某项⽬需要,在Qt下开发及调⽤带界⾯的DLL。
由于中间折腾时间较长才搞定,在这记录⼀下。
本帖⼦中所⽤Qt版本为QtCreator 4.10.2.基于Qt5.13.2(MSVC 2017,32位)1. Qt DLL开发1.1 ⼯程建⽴新建⼯程,选择:Library->C++ Library在⼯程细节中Qt module中选择 Widgets,如下图所⽰:⽣成的项⽬中⽂件列表如下:其中,在LaerRangerDLL_globall.h中,定义了宏# define LASERRANGERDLL_EXPORT Q_DECL_EXPORT查看Q_DECL_EXPORT的定义可以看出# define Q_DECL_EXPORT __declspec(dllexport)该定义即为dll导出符号的宏定义。
1.2 添加窗体新建窗体,选择Qt->Qt 设计师界⾯类,如下图所⽰:选Main Window,并添加到之前的项⽬:在窗体中加⼊⼀个Label,并修改显⽰字符串为:LaserRangerDLL。
然后修改LaserRangerDLL的头⽂件和源⽂件:头⽂件中做如下修改:头⽂件中添加ui_mainwindow.h和QWidget头⽂件并将给LaserRangerDLL类添加基类:QMainWindow,并修改其构造函数原型。
添加私有成员:Ui::MainWindow ui;修改源⽂件如下:在构造函数⾥添加ui.setupUi(this);1.3 ⽣成DLL在项⽬上点击右键:构建,⽣成DLL和Lib。
则在⼯程对应的Debug(或Release,和构建配置有关)⽂件夹⾥⽣成LaserRangerDLL.dll和LaserRangerDLL.lib⽂件。
2. 调⽤DLLDLL调⽤分为两种:隐式调⽤和显式调⽤。
其中,隐式调⽤是在编译时包含.lib⽂件和.h头⽂件,这两个⽂件中包含了动态库中导出的接⼝信息。
qt5开发及实例源代码
qt5开发及实例源代码一、Qt5开发简介Qt5是一款跨平台的C++图形用户界面应用程序开发框架,由挪威公司Trolltech(现在为Digia)开发。
它可以在Windows、macOS、Linux和其他操作系统上运行,是一个功能强大的GUI编程工具包。
Qt5提供了许多基本控件和高级控件,可以轻松地创建漂亮的用户界面。
同时,它还提供了许多工具和类来处理网络通信、数据库访问、XML解析等常见任务。
二、Qt5开发环境搭建1. 安装Qt5在官网上下载适合自己操作系统的Qt安装包,并按照提示进行安装。
2. 配置Qt Creator打开Qt Creator,选择Tools -> Options -> Kits,在这里添加一个新的Kit,选择对应的编译器和平台。
3. 创建一个新项目在File -> New File or Project中选择相应类型的项目并设置项目名称和路径。
三、Qt5实例源代码以下是几个简单的例子,展示了如何使用Qt5进行GUI编程:1. Hello World#include <QApplication>#include <QLabel>int main(int argc, char *argv[]){QApplication app(argc, argv);QLabel *label = new QLabel("Hello World!");label->show();return app.exec();}2. Button Clicked#include <QApplication>#include <QPushButton>int main(int argc, char *argv[]){QApplication app(argc, argv);QPushButton *button = new QPushButton("Click me!"); QObject::connect(button, SIGNAL(clicked()), &app, SLOT(quit()));button->show();return app.exec();}3. Dialog#include <QApplication>#include <QDialog>#include <QLabel>#include <QPushButton>int main(int argc, char *argv[]){QApplication app(argc, argv);QDialog *dialog = new QDialog;QLabel *label = new QLabel("Hello World!", dialog);QPushButton *button = new QPushButton("Close", dialog); QObject::connect(button, SIGNAL(clicked()), dialog,SLOT(close()));label->move(50, 50);button->move(100, 100);dialog->show();return app.exec();}以上代码仅供参考,更多实例请查看Qt官方文档。
QT开发——动态库静态库的生成与调用(Qmake和Cmake方式)
QT开发——动态库静态库的⽣成与调⽤(Qmake和Cmake⽅式)1.理解动态库与静态库区别链接:https:///wonengguwozai/article/details/93195827静态库和动态库最本质的区别就是:该库是否被编译进⽬标(程序)内部。
1.1 静态(函数)库⼀般扩展名为(.a或.lib),这类的函数库通常扩展名为libxxx.a或xxx.lib 。
这类库在编译的时候会直接整合到⽬标程序中,所以利⽤静态函数库编译成的⽂件会⽐较⼤,这类函数库最⼤的优点就是编译成功的可执⾏⽂件可以独⽴运⾏,⽽不再需要向外部要求读取函数库的内容;但是从升级难易度来看明显没有优势,如果函数库更新,需要重新编译。
1.2 动态函数库动态函数库的扩展名⼀般为(.so或.dll),这类函数库通常名为libxxx.so或xxx.dll 。
与静态函数库被整个捕捉到程序中不同,动态函数库在编译的时候,在程序⾥只有⼀个“指向”的位置⽽已,也就是说当可执⾏⽂件需要使⽤到函数库的机制时,程序才会去读取函数库来使⽤;也就是说可执⾏⽂件⽆法单独运⾏。
这样从产品功能升级⾓度⽅便升级,只要替换对应动态库即可,不必重新编译整个可执⾏⽂件。
1.3总结从产品化的⾓度,发布的算法库或功能库尽量使动态库,这样⽅便更新和升级,不必重新编译整个可执⾏⽂件,只需新版本动态库替换掉旧动态库即可。
从函数库集成的⾓度,若要将发布的所有⼦库(不⽌⼀个)集成为⼀个动态库向外提供接⼝,那么就需要将所有⼦库编译为静态库,这样所有⼦库就可以全部编译进⽬标动态库中,由最终的⼀个集成库向外提供功能。
2.qmake⽅式⽣成和调⽤动态/静态库链接:https:///lywzgzl/article/details/428059912.1 ⽣成库QT -= guiTARGET = laser_libTEMPLATE = libCONFIG += staticlib #加这句是⽣成静态库,不加则是动态库DEFINES += LASER_LIB_LIBRARYDEFINES += QT_DEPRECATED_WARNINGSLIBS += /usr/lib/x86_64-linux-gnu/libboost_thread.so\/usr/lib/x86_64-linux-gnu/libboost_system.soSOURCES += \laser_lib.cppHEADERS += \laser_lib.h \laser_lib_global.hinclude(LMS1xx/LMS1xx.pri)DESTDIR = $$PWD/../Libunix {target.path = /usr/libINSTALLS += target}2.2 调⽤库QT -= guiCONFIG += c++11 consoleCONFIG -= app_bundleDEFINES += QT_DEPRECATED_WARNINGS#增加系统库的依赖LIBS +=/usr/lib/x86_64-linux-gnu/libboost_thread.so\/usr/lib/x86_64-linux-gnu/libboost_system.so#增加⾃定义库的依赖LIBS += -L$$PWD/../Lib -llaser_lib #$$PWD获取当前pro⽂件的⽬录INCLUDEPATH += ../laser_libSOURCES += main.cppDESTDIR = $$PWD/../Lib3.cmake⽅式⽣成和调⽤动态库3.1创建共享库项⽬Cmake新建⼀个Qt Creator项⽬,在CMakeLists.txt中添加如下代码#-------------------------------------- 搜索软件包 --------------------------------------find_package(Qt5Widgets REQUIRED)find_package(Qt5Network REQUIRED)set(CMAKE_AUTOMOC ON)#-------------------------------------- 包含头⽂件 --------------------------------------include_directories(${Qt5Widgets_INCLUDE_DIRS})include_directories(${Qt5Network_INCLUDE_DIRS})include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)#-------------------------------------- -添加项⽬- --------------------------------------FILE(GLOB_RECURSE HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.h*)FILE(GLOB_RECURSE SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.c*)add_library(${PROJECT_NAME} SHARED${HEADER_FILES}${SOURCE_FILES}) #STATIC or SHARED 对应静态库或者动态库target_link_libraries(${PROJECT_NAME}${Qt5Widgets_LIBRARIES}${Qt5Network_LIBRARIES})#-------------------------------------- -设置输出- --------------------------------------set(OUTPUT_LIB_DIR ${PROJECT_BINARY_DIR}/libCACHE PATH "Output directory for libraries")file(MAKE_DIRECTORY ${OUTPUT_LIB_DIR})file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/${PROJECT_NAME})set(LIBRARY_OUTPUT_PATH ${OUTPUT_LIB_DIR})#-------------------------------------- -安装项⽬- --------------------------------------install(TARGETS ${PROJECT_NAME}EXPORT ${PROJECT_NAME}LIBRARY DESTINATION ${LIBRARY_OUTPUT_PATH})按需编辑plugintest.h和plugintest.cpp,这个就是该共享库项⽬的plugintest类了,我加⼊了⼀个int sum(int input1, int input2);公共函数,内容为:int Plugintest::sum(int input1, int input2){std::cout<<"Hello World!"<<std::endl;int sum = input1+input2;return sum;}保存并编译项⽬吧,没问题的话会在plugintest-build/lib⽬录⾥⽣成libplugintest.so。
Qt 5开发及实例 第13章 Qt 5数据库
1.SELECT语句
(10)比较子查询。这种子查询可以认为是IN子查询的扩展,它是表达式的值与子查询的结果进行比较 运算。查找课程号206的成绩不低于课程号101的最低成绩的学生学号。
WHERE birthday NOT BETWEEN '1999-1-1' and '1999-12-31'
1.SELECT语句
(7)空值比较。查询总学分尚不确定的学生情况。
SELECT * FROM students WHERE totalscore IS NULL
(8)自然连接查询。查找计算机系学生姓名及其“C程序设计”课程的考试分数情况。
/* IN子句 */
| expression { = | < | <= | > | >= | <> | != | !< | !> } { ALL | SOME | ANY } ( subquery )
/* 比较子查询 */
| EXIST ( subquery )
/* EXIS 5数据库
——常用SQL命令
01
数据查询
1.SELECT语句 2.常用聚合函数
1.SELECT语句
完备的SELECT语句很复杂,其主要的子句如下:
SELECT [DISTINCT] [别名.]字段名或表达式 [AS 列标题]
FROM table_source [ WHERE search_condition ]
QT动态库的编写和调用
QT动态库的编写和调⽤⼀、VS版本重点:(1)新建⼀个库⽂件项⽬,在项⽬⽂件夹中新建lib⽂件夹和include⽂件夹(2)指定该库⽂件项⽬的lib⽂件和include⽂件路径(3)主项⽬中添加库⽂件项⽬的lib⽂件和inlcude⽂件路径(4)添加头⽂件调⽤(1)新建项⽬1.选择项⽬类型为库⽂件【Qt Class Library】2.选择动态库需要的模块3.新建⼀个类4.新建的⽂件如下,并将第⼀级XViewLib更名为qt-common以便区分(2)新建lib⽂件夹和include⽂件夹1.新建lib⽂件夹,存放库⽂件供主项⽬使⽤2.在XViewLib项⽬中新建include⽂件夹,将项⽬的头⽂件都放到⾥⾯,供主项⽬使⽤3.将头⽂件移⼊include⽂件夹后,需将解决⽅案中的头⽂件重新加载:先移除,再到include⽂件夹中添加(3)XViewLib项⽬的属性页1.设置库⽂件的输出⽬录和名称2.XViewLib⽣成后会在主项⽬中⽣成.dll⽂件3.⽣成XViewLib的库⽂件4.添加上⾯新建的include头⽂件路径5.修改库⽂件名称,Debug版后加d6.将项⽬⽣成的lib⽂件输出到刚新建的lib⽂件夹中,供主项⽬使⽤(4)主项⽬DeviceClient的属性页1.输出⽬录和名称2.添加XViewLib项⽬中的include头⽂件路径3,添加XViewLib项⽬中的lib⽂件夹路径4.添加lib⽂件(5)整个解决⽅案的属性页(6)主项⽬调⽤XViewLib中的类1.添加头⽂件主项⽬调⽤XViewLib项⽬中的类时,需添加XViewLib项⽬中的头⽂件2.调⽤其中的类3.需要添加类时1》要在class后添加宏定义XVIEWLIB_EXPORT2》将新建类的头⽂件放到include⽂件夹中,再在解决⽅案中重新加载该头⽂件。
⼤功告成。
QT创建与调用Dll方法(包括类成员)--显式调用
QT创建与调⽤Dll⽅法(包括类成员)--显式调⽤看⽹上的好多关于QT调⽤Dll的⽅法,⼤部分都是调⽤函数的,并没有调⽤C++类成员的情况,即使是有,⽐如说:---(这⼀篇⾥没有调⽤类成员的)我就是按照这上⾯的教程⼀步步做的,可惜了都没成功~~~这⾥⾯都有⼀个最重要的步骤没有说清楚(可能怪我笨~~),路径问题所以这⾥⾃我做⼀下总结:创建时选择C++ Library就可以了,然后选择Shared Library(共享库),其他默认OK。
创建好后⽂件如下(我这⾥⼯程名为:dll)其中dll.pro代码为:1 2 3 4 5 6 7 8 9 10 11 12TARGET = dll TEMPLATE = lib DEFINES += DLL_LIBRARY SOURCES += \dll.cppHEADERS +=\dll_global.h \dll.hunix {target.path = /usr/libINSTALLS += 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_Hdll.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_Hdll.cpp代码为:1 2 3 4 5 6 7 8 9#include "dll.h"#include <iostream>Dll::Dll(){std::cout<<"New Dll Object !"<<endl; }Dll::~Dll(){std::cout<<"Dll Object Des~~"<<endl; }15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 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编译运⾏),如图:其中,.dll是在Windows下使⽤的,.o是在Linux/Unix下使⽤的。
qt5开发及实例代码
qt5开发及实例代码Qt5 是一个跨平台的应用程序开发框架,它提供了一个强大的工具集和 API,用于创建各种类型的应用程序,包括桌面应用程序、移动应用程序和嵌入式设备应用程序等。
下面是一个简单的 Qt5 开发实例代码,它创建了一个窗口,并在窗口中显示了一个标签和一个按钮。
```cpp#include <QApplication>#include <QLabel>#include <QPushButton>#include <QHBoxLayout>int main(int argc, char *argv[]){QApplication app(argc, argv);// 创建一个窗口QWidget window;window.setWindowTitle("Hello, Qt5");// 创建一个标签QLabel label("Hello, World!");label.setAlignment(Qt::AlignCenter);// 创建一个按钮QPushButton button("Click Me!");button.setAlignment(Qt::AlignCenter);// 创建一个水平布局,并将标签和按钮添加到布局中QHBoxLayout layout;layout.addWidget(&label);layout.addWidget(&button);// 将布局设置为窗口的主布局window.setLayout(&layout);// 显示窗口window.show();return app.exec();}```这个实例代码创建了一个简单的 Qt5 窗口应用程序,窗口中包含一个标签和一个按钮。
标签显示了文本"Hello, World!",按钮显示了文本"Click Me!"。
动态链接库(DLL)编写经验
动态链接库(DLL)编写经验我⾸先说明DLL的⽣成⽅法,之后再补充⼀些特殊之处。
⽣成⽅法:1.对需要导出的类,在头⽂件中添加#ifdef CLASS _API#define CLASS_API _declspec(dllexport )#else#define CLASS_API _declspec(dllimport )#endif2.在其cpp⽂件中添加#define CLASS_API _declspec(dllexport )注意这条语句⼀定要放在头⽂件链接的前⾯3.在类声明添加 CLASS_API,如:class CLASS_API Class1添加完以上编译命令后运⾏得到的⽂件在debug⽂件夹中,但注意有⽤的是后缀名为dll与lib的两个⽂件,以及类的头⽂件。
将这三个⽂件拷贝在需要使⽤该动态链接库的⽬录下。
然后在解决⽅案中添加lib⽂件和头⽂件,dll⽂件只需要拷贝在⼯程⽬录下⽽并不需要添加在解决⽅案中。
然后直接调⽤就可以。
再补充说明⼀些特殊的地⽅:1.⼀个动态链接库可以同时导出多个类,但注意每个类都要按照以上的⽣成⽅法处理。
当然在使⽤时每个类的头⽂件也都要拷贝在⼯程⽬录之下;2.根据实验dll⽂件的⽣成必须在win32控制台应⽤程序的DLL项⽬中,单纯的控制台应⽤程序即使添加了上述代码也不能⽣成dll⽂件,只是多⽣成了lib⽂件。
⽽没有dll⽂件是⽆法运⾏3.⼀旦选择了dll链接库项⽬,⾄于类声明是_declspec (dllexport )还是_declspec (dllimport ),似乎并没有影响,运⾏结果⼀致且都成功。
按理说类声明在编写时应该为_declspec (dllexport ) 。
但可能是项⽬本⾝的编译设置忽略的这点差异,只要类是声明为dll相关的都会导出到dll⽂件中。
当然如果两个声明语句都没有⾃然是⽆法导出的。
4.在多个类嵌套的情况下要特别注意最终导出的类的封装。
qtdll的调用及与主程序的交互
qtdll的调用及与主程序的交互近期,研究了下将qt程序封装成dll,与其他程序(mfc、c#)进行调用交互,主要涉及几个方面内容:一、qt生成dll按照qt官方引导,可以很简单的生成dll,但是此类dll只能与qt 程序进行交互;由于qt 的事件循环机制与windows寻坏机制不同,要想在其他程序中启动qt的dll,必须加入QApplication,以启动qt 的事件循环机制。
通过官方发布的qtwinmigrate文件,可以非常方便的实现dll。
加载exmaples/qtdll的.pro工程文件,在qtcreator可以看到main.cpp有这两个函数BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpvReserved*/ ){//此蔚dll的入口函数static bool ownApplication = FALSE;//启动QAppliction,具体见帮助说明if ( dwReason == DLL_PROCESS_ATTACH )ownApplication = QMfcApp::pluginInstance( hInstance );if ( dwReason == DLL_PROCESS_DETACH && ownApplication )delete qApp;return TRUE;}//建立导出函数extern "C" __declspec(dllexport) bool showDialog( HWNDparent ){QWinWidget win( parent );win.showCentered();QMessageBox::about( &win, "About QtMfc", "QtMfc Version 1.0\nCopyright (C) 2003" );return TRUE;}qtdll工程实际引入了qtwinmigrate的三个头文件,qmafcapp、qwinhost、qwinwidget,能够连接qt程序与其他外部程序,具体功能看帮助。
动态链接库(dll)和静态库的创建及使用教程
动态链接库和静态库的创建及使用教程第一部分静态库(以vs2005为例)一、创建新的静态库项目1.从“文件”菜单中,选择“新建”,然后选择“项目…”。
2.从“项目类型”窗格中,选择“Visual C++”下的“Win32”。
3.从“模板”窗格中,选择“Win32 控制台应用程序”。
4.为项目选择一个名称,如“MathFuncsLib”,并将其输入“名称”字段。
为解决方案选择一个名称,如“StaticLibrary”,并将其输入“解决方案名称”字段。
5.按“确定”启动Win32 应用程序向导。
在“Win32 应用程序向导”对话框的“概述”页中,按“下一步”。
6.从“Win32 应用程序向导”的“应用程序设置”页中,选择“应用程序类型”下的“静态库”。
7.从“Win32 应用程序向导”的“应用程序设置”页中,取消选择“附加选项”下的“预编译头”。
8.按“完成”创建项目。
向静态库添加类1.若要为新类创建头文件,请从“项目”菜单中选择“添加新项…”。
将显示“添加新项”对话框。
从“类别”窗格中,选择“Visual C++”下的“代码”。
从“模板”窗格中选择“头文件(.h)”。
为头文件选择一个名称,如“MathFuncsLib.h”,并按“添加”。
将显示一个空白文件。
2.添加一个名为“MyMathFuncs”的简单类,以执行常见的算术运算,如加、减、乘和除。
代码应与以下内容类似:// MathFuncsLib.hnamespace MathFuncs{class MyMathFuncs{public:// Returns a + bstatic double Add(double a, double b);// Returns a - bstatic double Subtract(double a, double b);// Returns a * bstatic double Multiply(double a, double b);// Returns a / b// Throws DivideByZeroException if b is 0static double Divide(double a, double b);};}3.若要为新类创建源文件,请从“项目”菜单中选择“添加新项…”。
QT5动态链接库的创建和使用
QT5动态链接库的创建和使⽤记录⼀下QT5 动态链接库的创建和使⽤在⽂章的最后有完成的代码供下载1.创建动态链接库先新建⼀个库项⽬选择chose进⼊下⼀下页⾯,类型选择共享库,输⼊⼀个名称:我输⼊的是sld再点击下⼀步到如果这⾥我们需要QtGui所以也勾选上了再点击下⼀步直到完成我们在.pro⽂件⾥加上DESTDIR =..\MyDebug它的意思是我们把⽣成的内容放到这个⽂件夹⾥,如果没有它会⾃动⽣成点击项⽬把Shadow build 去掉勾选设置完成后我们来实现⽅法测试把sld.h修改成这样#ifndef SLD_H#define SLD_H#include "sld_global.h"#include <QString>class SLDSHARED_EXPORT Sld{public :Sld();QString GetStr();};#endif它的.cpp#include "sld.h"#include <QDebug>Sld::Sld(){qDebug()<<"";}QString Sld::GetStr(){return"aa";}我们那了⼀个测试⽅法返回aa我们再新添加⼀个窗体供测试⽤我给命名为MyDialog把.h⽂件修改成#ifndef MYDIALOG_H#define MYDIALOG_H#include <QDialog>#include "sld_global.h"namespace Ui {class MyDialog;}class SLDSHARED_EXPORT MyDialog : public QDialog{Q_OBJECTpublic:explicit MyDialog(QWidget *parent = 0);~MyDialog();private:Ui::MyDialog *ui;};#endif// MYDIALOG_H,cpp#include "mydialog.h"#include "ui_mydialog.h"MyDialog::MyDialog(QWidget *parent) :QDialog(parent),ui(new Ui::MyDialog){ui->setupUi(this);}MyDialog::~MyDialog(){delete ui;}这⾥什么也没做只是把SLDSHARED_EXPORT加上了好了就这样,我们构建⼀下就会在MyDebug⽂件夹⾥⽣成我们的dll2.怎么使⽤动态链接库新建⼀个Qt WidgetsApplication项⽬在.pro⽂件⾥修改和上边⼀样加上DESTDIR =..\MyDebug 再点击项⽬把shadow build 去掉再加上INCLUDEPATH +=../sldLIBS += -L$$DESTDIR -lsld第⼀句是把sld项⽬的⽂件夹包含到这个项⽬⾥来,这样我们就能直接⽤它⾥⾯的头⽂件了第⼆句是告诉编译器lib在哪(我⽤的是vs的编译器如果⽤mingw可以直接添加sld.dll)我样在窗体上加⼀个按钮,并添加槽.h#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private slots:void on_pushButton_clicked();private:Ui::MainWindow *ui;};#endif// MAINWINDOW_H.cpp#include "mainwindow.h"#include "ui_mainwindow.h"#include "sld.h"#include <QMessageBox>#include "mydialog.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);}MainWindow::~MainWindow(){delete ui;}void MainWindow::on_pushButton_clicked(){MyDialog * my =new MyDialog(this);my->show();QMessageBox * msg=new QMessageBox(this); Sld s;msg->setText(s.GetStr());msg->show();}好了,构建,运⾏看效果吧源代码:。
QT5开发与实践第2章Qt5模板库工具类及控件
QT5开发与实践第2章Qt5模板库工具类及控件Qt5是一款跨平台的应用程序开发框架,提供了丰富的模板库、工具类和控件,可以帮助开发者快速地实现各种功能和界面效果。
本文将介绍Qt5的模板库、工具类和控件,并探讨其在实践中的运用。
模板库是Qt 5中的重要组成部分,包含了许多用来实现通用算法的模板类。
其中,最常用的是容器类,如QList、QVector、QMap等。
容器类提供了高效的数据存储和访问方式,可以方便地处理各种类型的数据。
此外,Qt 5还提供了一系列的迭代器,用于遍历和访问容器中的元素。
通过使用模板库,开发者可以快速地实现各种数据结构和算法,提高程序的性能和效率。
工具类是Qt 5中的另一个重要部分,包含了许多常用的工具函数和类。
其中,最常用的是QDateTime、QFile、QDir等。
QDateTime类提供了日期和时间的处理能力,可以方便地进行日期和时间的计算和转换。
QFile类提供了文件操作的接口,可以方便地进行文件的读写和控制。
QDir类提供了目录操作的接口,可以方便地进行文件夹的遍历和管理。
通过使用工具类,开发者可以方便地进行各种常用操作,提高程序的易用性和可维护性。
在实践中,Qt 5的模板库、工具类和控件被广泛应用于各种类型的应用程序开发。
例如,在图像处理应用程序中,可以使用QImage类进行图像的加载、保存和处理;在网络通信应用程序中,可以使用QTcpSocket类进行网络连接和数据传输;在数据库应用程序中,可以使用QSqlDatabase类进行数据库的连接和操作。
此外,开发者还可以根据需要自定义和扩展Qt 5的模板库、工具类和控件,以满足特定的需求。
总之,Qt5的模板库、工具类和控件是开发者在实践中不可或缺的工具和组件,可以帮助开发者快速地实现各种功能和界面效果。
通过熟练掌握和灵活运用这些工具和组件,开发者可以轻松地构建出高质量的应用程序,提高开发效率和用户体验。
QT5编写和调用DLL动态库的终极实践
QT5编写和调用DLL动态库的终极实践如今,使用QT编程的人越来越多,但由于缺乏相关的中文文档,使得大家在学习的过程中偶有碰壁,网上的大多也有疏漏税,即使照着做也未必能成功。
今天给大家讲讲QT5.02编写和调用DLL动态库的编程实践,按照以下方法可以确保你对DLL编写和调用少走变路。
步聚一:编写所需的DLL文件,如下图创建C++库文件工程。
类型选择此处选的是动态库。
工程名dll,生成的类名为Dll。
如下图,在dll.h 头文件中加入函数SHOW。
在dll.cp中编写该函数的实现。
此处我让函数打开一个窗口并在应用程序输出中输出“OK”字符。
顺便讲一下在DLL编写时如何加入容积资源文件。
依次点击“文件”菜单选择“新建文件或项目”然后如图选择“QT设计师界面类”生成的文件及类名如下图:#include"dll.h"#include"qdebug.h"#include"dialog.h"Dll::Dll(){}void Dll::show(){Dialog*wi=new Dialog();wi->show();qDebug()<<"ok";}到这里,DLL文件的编写结束。
最后一步就是构建该程。
在该程名字上点鼠标右键,再选择构建。
接下来编写测试工程,类型为QT GUI应用。
工程名字为PO,在po.pro文件中加入LIBS+=..\dll.DLL,完整代码如下:#-------------------------------------------------##Project created by QtCreator2013-08-06T10:19:12#LIBS+="D:\c\po\dll.dll"#-------------------------------------------------QT+=core guigreaterThan(QT_MAJOR_VERSION,4):QT+=widgetsTARGET=poTEMPLATE=appLIBS+=..\dll.DLLSOURCES+=main.cpp\mainwindow.cppHEADERS+=mainwindow.h\dll.h\dll_global.hFORMS+=mainwindow.ui在mainwindo.ui加一个按纽,并添加单击槽函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
QT5编写和调用DLL动态库的终极实践如今,使用QT编程的人越来越多,但由于缺乏相关的中文文档,使得大家在学习的过程中偶有碰壁,网上的大多也有疏漏税,即使照着做也未必能成功。
今天给大家讲讲QT5.02编写和调用DLL动态库的编程实践,按照以下方法可以确保你对DLL编写和调用少走变路。
步聚一:
编写所需的DLL文件,如下图创建C++库文件工程。
类型选择此处选的是动态库。
工程名dll,生成的类名为Dll。
如下图,在dll.h 头文件中加入函数SHOW。
在dll.cp中编写该函数的实现。
此处我让函数打开一个窗口并在应用程序输出中输出“OK”字符。
顺便讲一下在DLL编写时如何加入容积资源文件。
依次点击“文件”菜单选择“新建文件或项目”然后如图选择“QT设计师界面类”
生成的文件及类名如下图:
#include"dll.h"
#include"qdebug.h"
#include"dialog.h"
Dll::Dll()
{
}
void Dll::show(){
Dialog*wi=new Dialog();
wi->show();
qDebug()<<"ok";
}
到这里,DLL文件的编写结束。
最后一步就是构建该程。
在该程名字上点鼠标右键,再选择构建。
接下来编写测试工程,类型为QT GUI应用。
工程名字为PO,
在po.pro文件中加入LIBS+=..\dll.DLL,完整代码如下:
#-------------------------------------------------
#
#Project created by QtCreator2013-08-06T10:19:12
#LIBS+="D:\c\po\dll.dll"
#-------------------------------------------------
QT+=core gui
greaterThan(QT_MAJOR_VERSION,4):QT+=widgets
TARGET=po
TEMPLATE=app
LIBS+=..\dll.DLL
SOURCES+=main.cpp\
mainwindow.cpp
HEADERS+=mainwindow.h\
dll.h\
dll_global.h
FORMS+=mainwindow.ui
在mainwindo.ui加一个按纽,并添加单击槽函数。
完整代码如下:
#include"mainwindow.h"
#include"ui_mainwindow.h"
#include"dll.h"
MainWindow::MainWindow(QWidget*parent):
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
Dll*pd=new Dll();
pd->show();
}
此处切记导入dll.h 头文件。
关键步聚来了,我们需要把dll工程中的所有头文件COPY到po工程目录下,并且在po工程名上点右键选择“添加现有文件”,把COPY过来的头文件全部加入到工程的树型列表中。
并且把dll工程生成的DLL文件COPY到po工程的debuG目录下。
路径搞不清的的看图,很多网上教程没说这一步,其实这才是大家调
用不成功的关键原因之一。
最终运行效果如下:。