现在的位置: 首页 > 综合 > 正文

Qt Creator 为我们的程序写一个动态链接库help.dll

2013年07月29日 ⁄ 综合 ⁄ 共 4384字 ⁄ 字号 评论关闭

声明我的配置是

1.我在的系统是win7 64位的操作系统 2G内存

2.已安装了vs2010旗舰版

3.顺序安装 后面的是我的安装路径

                 1. qt-win-opensource-4.8.2-vs2010.exe        

                 2. qt-vs-addin-1.1.11-opensource.exe           

                 3. qt-creator-win-opensource-2.5.0.exe

4.编译器是vs2010的 win32-msvc2010        

开始写动态链接库help.dll 这是一个调用Qt Assistant的一个dll,有关调用assistant的请参考《Qt Assistant的调用给我们的程序添加help》

1.打开Qt Creator ->新建->Libraries->C++库->选择->(类型)共享库/名称help->下一步->下一步->选择你要用到的Qt库 本blog这个例子用QtGui /QtCore->下一步->下一步

2.把help.h改成如下

****************************************************************************************************************

/*
 * @2012-10-9
 */
#ifndef HELP_H
#define HELP_H

#include <QtCore/QString>
#include "help_global.h"

class QProcess;

class HELPSHARED_EXPORT Help
{
public:
    Help();
    ~Help();

    void showDocumentation(const QString &file);

private:
    bool startHelp();
    QProcess *m_proc;
};

#endif // HELP_H
*********************************************************************
3.help.cpp改成如下
/* 
* @2012-10-9 
* 帮助文档核心调用assistant.exe 
*/
#include <QtCore/QByteArray>
#include <QtCore/QDir>
#include <QtCore/QProcess>
#include <QtGui/QMessageBox>
#include "help.h"

Help::Help() : proc(0)
{
}

Help::~Help()
{    
	if (proc && proc->state() == QProcess::Running) {        
		proc->terminate();        
		proc->waitForFinished(3000);    
		}    
		delete proc;
}

void Help::showDocumentation(const QString &page)
{    
	if (!startHelp())        
	return;    
	//首页显示    
	QByteArray ba("SetSource ");    
	ba.append("qthelp://com.PeralGlobal.RobotWorkbench.help/doc/"); 
	
	proc->write(ba + page.toLocal8Bit() + '\n');}bool Help::startHelp(){    
	if (!proc){
		proc = new QProcess();    
	}
	
	if (proc->state() != QProcess::Running){        
		QDir dir;        
		//获取assistant.exe的路径        
		QString app = dir.currentPath() + QDir::separator();        
		app += QLatin1String("assistant.exe");        
		//执行命令        
		QStringList args;        
		args << QLatin1String("-collectionFile")            
			<< dir.currentPath()            
			+ QLatin1String("/documentation/help.qhc")            
			<< QLatin1String("-enableRemoteControl");        
			//执行进程        
		proc->start(app, args);        
		if (!proc->waitForStarted()){            
				QMessageBox::critical(0, QObject::tr("RobotWorkbench Help"),                
				QObject::tr("Unable to launch Robot Workbench Assistant (%1)").arg(app));            
				return false;        
		}    
	}    
	return true;
}
*********************************************************************
4.构建help.pro工程
在相应的目录下debug下生成如下文件。
>help.dll //就是我们程序要的dll动态链接库,程序发行时所用到的。真正代码所在的位置,实现的方式。
>help.exp //只有生成dll是才会生成这个exp文件 ,exp就是导出文件(export file)包含导出函数和数据项的信息。
>help.ilk //当选定渐增型编译连接时,连接器自动生成ilk文件,记录连接信息LINK工具使用。
>help.intermediate.manifest //Manifest文件保存了Windows可执行文件(包括exedll文件)要运行起来的环境设置信息,文件名一般是可执行文件的文件全名加上.manifest。例如notepad.exemanifest文件就应该是notepad.exe.manifest。例外有的程序将manifest文件直接嵌入到可执行文件的资源里面了,这也就是为什么有的时候你看不到程序的manifest文件的原因。
>help.lib  //lib是静态的库文件,在编译的时候要编译进去的,运行时就不需要lib了,此时这个lib里面是一些索引信息。
>help.obj  //lib就是一堆obj的组合,每一个.cpp都会生成一个obj,目标文件,一般是程序编译后的二进制文件,再通过连接器和资源文件链接就成exe文件了
>help.pdb  //帮助我们调试用的。http://www.cnblogs.com/itech/archive/2011/08/15/2136522.html
*******************************************************************************
5.写一个测试程序调用这个dll 
新建工程Qt Gui应用程序->各种下一步-> 名字helpPushbutton
6..h文件 
*******************************************************************************
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
******************************************************************
7.cpp文件
******************************************************************
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "help.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    Help *help = new Help;
    help->showDocumentation("helpintro.html");
}
********************************************************************
8.pro文件
********************************************************************
QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = helpPushbutton
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

INCLUDEPATH += ./
LIBS +=./help.lib

 

INCLUDEPATH += ./  //这个告诉我们的应用程序help.h和help_global.h的路径,你可以把它考到当前工程目录下。像我这样就可以了
LIBS +=./help.lib  //我在编译的时候要用lib,告诉程序接口是哪个。也把它放到pro的当前的目录下,当然你也可以写自己的目录,注意路径正反斜杠
!!!!!!!!!!!!!!!!!!!
****************************************************************
9.点击构建。运行发现什么都没有,???
10.拷贝help.dll到helpPushbutton的debug下,还有assistant.exe还有assistant.exe启动相关的dll。还有文件夹documentation,文件夹内的help.qch,help.qhc相关参考《Qt Assistant的调用给我们的程序添加help》

抱歉!评论已关闭.