分类: C/C++
2011-11-21 13:28:23
http://blog.csdn.net/derryzhang/article/details/4653708
这些天在做一个工程,要用到Qt,所以特别研究了一下Qt显式调用链接库的问题。隐式调用就不那么想用了,个人感觉隐式调用既浪费内存,造成程序启动速度极慢,又容易造成链接错误(本人在ogre中深受链接错误之苦),所以只用了显式调用。以前只试过在MFC中显式调用dll,在Qt上还没试过。其实细细研究一下,相对于MFC的调用来说,Qt的调用也是大同小异的。在这里分享一下。
首先用VS写一个dll先(名字为QtDllTest)。写dll最大的问题就是解决导出函数重命名问题。其中解决方法是多种多样的。本人只用自己最常用一种——用模块定义文件.def。
第一步,写一个dll,简单写一个测试加法函数的:
int add(int a,int b)
{
return a+b;
}
之后添加一个模块定义文件QtDllTest.def:
LIBRARY "QtDllTest"
EXPORTS
add
之后顺利生成dll.
现在可以利用dll函数导出工具DLL Export Viewer查看刚才生成的dll中的导出函数:
发现,导出函数名字没有乱码,说明导出函数正常。
现在,就以这个dll为例来试着用Qt调用。
新建一个名为QtDllTestDemo的Qt Application:
默认,下一步
继续下一步:
Finish就行了。反正一切默认就行。
在ui界面中加入一个pushButton(ObjectName:CalButton,Text:Calculate),一个Label控件(Text:Result),一个lineEdit控件(ObjectName:Result),主要是在点击按钮后调用dll并计算把计算结果显示在文本框中,如下图所示:
为了顺利使用dll,我们要在qtdlltestdemo.cpp开始包含这个东西:#include
下面给pushButton添加click响应事件:
void QtDllTestDemo::on_CalButton_clicked()
{
QLibrary lib("QtDllTest.dll");
if (lib.load())
{
typedef int(*AddFunction)(int a,int b);
AddFunction Add=(AddFunction)lib.resolve("add");
if (!Add)
{
ui.Result->setText("Failed!");
}
else
{
int m;
m=Add(1,1); //来个计算1+1
QString str=QString("%1").arg(m);
ui.Result->setText(str);
}
}
else
{
ui.Result->setText("Failed!");
}
}
之后生成程序,复制在开始生成的dll文件到QtDllTestDemo的Debug或者Release目录中运行,点击“Calculate"按钮,发现已经成功调用:
其实和MFC的调用也就差那么一两句话,真可谓大同小异。导出类中函数亦如此。