Qt隐式、显式调用DLL
2018-01-19 22:40
337 查看
下面是我对Qt隐式/显式调用DLL一点理解,我参考的相关网址会在下面罗列出来:
①显示调用
这里我觉得http://www.cnblogs.com/newstart/archive/2013/01/23/2873611.html的例子挺好的,使用Qt创建了一个加法函数和查询页面并封装成DLL以供Qt调用。
在头文件里申明DLL共享接口:
[cpp] view
plain copy
#include "MyTestDll_global.h"
#include "qdialog.h"
[cpp] view
plain copy
extern "C++" Q_DECL_EXPORT int add(int a,int b);
extern "C++" Q_DECL_EXPORT QDialog *showDialog();
在源文件里添加DLL共享接口:
[cpp] view
plain copy
int add(int a,int b)
{
return a+b;
}
QDialog *showDialog()
{
MyShowTest *ss=new MyShowTest();
return ss;
}
生成后将DLL置于需要调用该DLL的工程的输出目录中,调用DLL程序部分如下:
[cpp] view
plain copy
QLibrary mylib("MyTestDll.dll"); //声明所用到的dll文件
int result;
QString sresult;
if (mylib.load()) //判断是否正确加载
{
Fun open=(Fun)mylib.resolve("add"); //援引 add() 函数
if (open) //是否成功连接上 add() 函数
{
int s1=this->ui->lineEdit->text().toInt();
int s2=this->ui->lineEdit_2->text().toInt();
result=open(s1,s2); //这里函数指针调用dll中的 add() 函数
sresult=QString::number(result);
this->ui->lineEdit_3->setText(sresult);
}
}
else
{
QMessageBox::information(NULL,"NO","DLL is not loaded!");
}
注意须添加qlibrary.h 。
http://blog.csdn.net/derryzhang/article/details/4653708这里用VS搭配Qt写了一个DLL文件,然后Qt调用该DLL。其特别之处在于,用VS搭配Qt写DLL时用到了模块定义文件。
②隐式调用
参考http://www.cnblogs.com/hicjiajia/archive/2010/08/27/1810239.html
[cpp] view
plain copy
LIBS+= -LD:/qt/MyTest_2 -lMyTestDll
注: 1、-L 参数指定 .lib/.a 文件的位置
2、-l 参数指定导入库文件名(不要加扩展名)
3、另外,导入库文件的路径中,反斜杠用的是向右倾斜的
4、Qt要隐式调用DLL的话,须把dll文件放在程序的输出目录中,lib所存放的文件路径随便,但是须由上述.pro文件中的LIBS指定语句指定其所在文件夹,.h文件放在程序当前目录下即可。
调用DLL程序部分如下:
[cpp] view
plain copy
extern "C++"
{
#include "mytestdll.h"
}
int main(int argc ,char **argv)
{
QApplication app(argc,argv);
qDebug()<<add(5,6); // dll 中的一个加法函数
QDialog *d=showDialog();
d->show();
return app.exec(); //完成使命后,直接退出,不让它进入事件循环
}
总的说一句:
显式调用:需要在程序里使用语句将DLL导入,打开共享库,使用后再关闭。
隐式调用:不需要使用语句导入,直接调用即可。
①显示调用
这里我觉得http://www.cnblogs.com/newstart/archive/2013/01/23/2873611.html的例子挺好的,使用Qt创建了一个加法函数和查询页面并封装成DLL以供Qt调用。
在头文件里申明DLL共享接口:
[cpp] view
plain copy
#include "MyTestDll_global.h"
#include "qdialog.h"
[cpp] view
plain copy
extern "C++" Q_DECL_EXPORT int add(int a,int b);
extern "C++" Q_DECL_EXPORT QDialog *showDialog();
在源文件里添加DLL共享接口:
[cpp] view
plain copy
int add(int a,int b)
{
return a+b;
}
QDialog *showDialog()
{
MyShowTest *ss=new MyShowTest();
return ss;
}
生成后将DLL置于需要调用该DLL的工程的输出目录中,调用DLL程序部分如下:
[cpp] view
plain copy
QLibrary mylib("MyTestDll.dll"); //声明所用到的dll文件
int result;
QString sresult;
if (mylib.load()) //判断是否正确加载
{
Fun open=(Fun)mylib.resolve("add"); //援引 add() 函数
if (open) //是否成功连接上 add() 函数
{
int s1=this->ui->lineEdit->text().toInt();
int s2=this->ui->lineEdit_2->text().toInt();
result=open(s1,s2); //这里函数指针调用dll中的 add() 函数
sresult=QString::number(result);
this->ui->lineEdit_3->setText(sresult);
}
}
else
{
QMessageBox::information(NULL,"NO","DLL is not loaded!");
}
注意须添加qlibrary.h 。
http://blog.csdn.net/derryzhang/article/details/4653708这里用VS搭配Qt写了一个DLL文件,然后Qt调用该DLL。其特别之处在于,用VS搭配Qt写DLL时用到了模块定义文件。
②隐式调用
参考http://www.cnblogs.com/hicjiajia/archive/2010/08/27/1810239.html
[cpp] view
plain copy
LIBS+= -LD:/qt/MyTest_2 -lMyTestDll
注: 1、-L 参数指定 .lib/.a 文件的位置
2、-l 参数指定导入库文件名(不要加扩展名)
3、另外,导入库文件的路径中,反斜杠用的是向右倾斜的
4、Qt要隐式调用DLL的话,须把dll文件放在程序的输出目录中,lib所存放的文件路径随便,但是须由上述.pro文件中的LIBS指定语句指定其所在文件夹,.h文件放在程序当前目录下即可。
调用DLL程序部分如下:
[cpp] view
plain copy
extern "C++"
{
#include "mytestdll.h"
}
int main(int argc ,char **argv)
{
QApplication app(argc,argv);
qDebug()<<add(5,6); // dll 中的一个加法函数
QDialog *d=showDialog();
d->show();
return app.exec(); //完成使命后,直接退出,不让它进入事件循环
}
总的说一句:
显式调用:需要在程序里使用语句将DLL导入,打开共享库,使用后再关闭。
隐式调用:不需要使用语句导入,直接调用即可。
相关文章推荐
- Qt调用qt生成的dll 显式和隐式(静态动态)
- C++ 多个类的DLL封装以及隐式链接和显式链接2种方法调用
- 关于显式调用DLL、隐式调用DLL和查看DLL输出函数
- Qt中隐式调用VS建立的dll动态库
- Dll的显式和隐式调用
- 关于显式调用DLL、隐式调用DLL和查看DLL输出函数
- 关于显式调用DLL、隐式调用DLL和查看DLL输出函数
- QT编写和调用dll动态库最新版(隐式调用)
- Dll的显式和隐式调用
- DLL DEF文件编写方法 VC++ 调用、调试DLL的方法 显式(静态)调用、隐式(动态)调用
- C++ dll的隐式与显式调用
- Dll的显式和隐式调用
- Qt中调用VS编译dll的方法(一)----显式调用
- Dll的显式和隐式调用
- 动态链接库的生成(dll)和 动态链接库隐式and显式调用
- Qt显式调用动态文件(dll)
- DLL隐式与显式调用浅析
- 关于显式调用DLL、隐式调用DLL和查看DLL输出函数
- QT创建与调用Dll方法(包括类成员)--显式调用
- Qt隐式/显式调用DLL