最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后再动态调用DLL给出的接口函数,使封装在DLL内部的QT界面跑起来,在网上查了很多资料,今天终于成功了,经验不敢独享,因为CSDN给了我很多帮助,将心得写在这里供大家参考。

PS:本文中谈的是用QT封装一个包含界面的DLL,然后在其他任何地方使用任何语言来调用这个DLL,不是那种在qt creator里面建一个dll工程,然后再在qt creator里建一个调用该dll的工程的情况(这种示例可参考该链接http://download.csdn.net/source/2855817)。

本文所讲的例子在qt 4.7.3 opensource 以及VC6.0/VS2005成功运行

首先,在qt creator中是可以直接建立一个C++ DLL工程的,编译以后也可以生成dll,但是这样生成的dll拿VC去调是不会成功的。后来在CSDN上看到有人发的这样一篇帖子(原文链接http://blog.csdn.net/normallife/article/details/5397980)。里面谈到 “因为 QT 必须有调用 QApplication 的 exec 方法,这样才能产生消息循环, QT 的程序才可以运行。所以说如果我们使用了 QT 编写了 dll 程序,在普通的 windows 程序中是不能调用的。在调用的时候会出现错误。当然 QT 提供了解决方法:那就是 QTWinmigrate”。喜出望外啊,赶紧的把QTWinmigrate下下来。
   打开QTWinmigrate文件夹,里面有几个目录,buildlib,doc,examples,lib,src。
   在examples目录下给出几个应用QTWinmigrate的例子,其中有一个就是qtdll,嘿嘿,用qt creator打开其中的qtdll.pro工程文件。因为这个是已经做好的程序,所以可以直接在此基础上修改。右键单击目录树最上层的工程名qtdll,选择“添加新有文件”,然后新建一个“QT设计师界面类”,类名什么的自己填上,点确定返回,可以看到后缀为.ui的界面文件及界面文件的.h文件和.cpp文件已经加入到qtdll工程里面了,界面你怎么画都行,剩下的步骤就是修改工程中的main.cpp文件
首先在main.cpp文件里面把界面文件的头文件include进来,然后将DLL发布接口函数的部分修改为如下所示:

  1. extern "C" __declspec(dllexport) int main(int argc, char *argv[])
  2. {
  3. QApplication a(argc, argv);
  4. ****** w;
  5. w.show();
  6. return a.exec();
  7. }

其中******是你界面文件的.h文件中定义的界面类名
   这样我们得DLL就做好了,然后点构建,就可以生成封装了QT界面并且可以用VC调用的DLL了

在CSDN的第一篇技术贴,说的不详细的大家有什么不懂的可以问我,文章中有什么不对的欢迎大牛指教

转载:http://topic.csdn.net/u/20110706/20/200af06e-5010-4667-8f83-3c3cfb46cacd.html

http://qimo601.iteye.com/blog/1675575

将QT开发的界面程序封装成DLL,在VC中成功调用(必须有消息循环,所以使用了QTWinmigrate,附CSDN可下载的Demo)的更多相关文章

  1. 将QT开发的界面程序封装成DLL,在VC中成功调用

    最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后再动态调用DLL给出的接口函数,使封装在DLL内部的QT界面跑起来,在网上查了很多资料,今天终于成功了,经验不敢独享,因为CSDN给了我很多 ...

  2. 55.Qt-将界面程序封装成静态库

    1.生成dll 然后选择创建静态链接库: 创建的时候,记得勾选QtGui,并且修改pro文件,添加下面1句(这样就可以创建界面了): 修改staticlib.cpp: #include "s ...

  3. 54.Qt-将界面程序封装成动态库DLL

    1.生成dll 然后选择创建共享库: 创建好后,修改pro文件,改为下面两句(这样就可以创建界面了):  然后修改sharedlib.h: #ifndef SHAREDLIB_H #define SH ...

  4. 在桌面Linux环境下开发图形界面程序的方案对比

    在Linux下开发GUI程序的方法有很多,比如Gnome桌面使用GTK+作为默认的图形界面库,KDE桌面使用Qt作为默认的图形界面库,wxWidgets则是另一个使用广泛的图形库,此外使用Java中的 ...

  5. 使用cocoa捕获dock栏中的“退出”事件,解决qt开发的应用程序退出异常的问题

    最近在移植一个QT开发的应用程序到mac平台,由于我们的应用在退出时需要释放一些资源,不然在mac系统会报崩溃事件,但是当用户使用dock栏上面的退出功能时,没有捕获到这个退出事件,导致无法正常退出. ...

  6. C#封装成DLL,并在C#中调用

    一.C#封装成DLL 1.在VS中创建项目选择类库,命名 myDll 2.建立好项目后自动生成的代码如下: 代码修改如下,添加自己要封装的C#代码,注意修饰符必须为public using Syste ...

  7. Go 程序编译成 DLL 供 C# 调用。

    Go 程序编译成 DLL 供 C# 调用. C# 结合 Golang 开发   1. 实现方式与语法形式 基本方式:将 Go 程序编译成 DLL 供 C# 调用. 1.1 Go代码 注意:代码中 ex ...

  8. unity脚本封装成dll

    先申明一下这样做是有需要的.当我们需要把脚本提供给第三方使用,而又不希望对方看到具体的实现过程,这时候就需要将代码封装编译成dll文件,供第三方调用.或是多个项目都要用到同一个模块或同样的功能,则可以 ...

  9. 使用DOS命令将类库封装成dll

    1.Windows键+R.输入cmd进入DOS 2.使用 cd  加路径找到需要封装成dll的类库文件 3.csc /target:library /out:dll的名字.DLL 需要封装的cs文件

随机推荐

  1. sqlserver中的存储过程 函数 事物 索引及视图

                                           存储过程和函数具体的区别: 核心提示:本质上没区别.只是函数有限制只能返回一个标量,而存储过程可以返回多个.并且函数是可以 ...

  2. 浅谈CAS(Compare and Swap) 原理

    浅谈CAS原理java并发编程也研究了一段时间了,对CAS的原理总是不太理解,今天再研究了一下,记录一些自己的理解.    说到CAS,再java中的某些情况下,甚至jdk1.5以后的大多数情况,并发 ...

  3. 查询系统状态 内存大小 cpu信息 设备负载情况

    1.1 查看内存状态 /proc/meminfo里面存放着内存的信息 查看内存命令(包括虚拟内存swap): free -h (低版本系统可能不支持-h) 或者 free -m (以mb单位显示) a ...

  4. SVM明确的解释1__ 线性可分问题

    笔者:liangdas 出处:简单点儿,通俗点儿,机器学习    http://blog.csdn.net/liangdas/article/details/44251469 引言: 1995年Cor ...

  5. VC和matlab混合开发遇到的问题及其解决办法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 1. error C2011: '_INTERFACE_INFO' : 'struct' type redefinit ...

  6. Codeforces 39J Spelling Check hash

    主题链接:点击打开链接 意甲冠军: 特定2弦 选择中删除一个字符串的第一个字母,得2个字符串全然同样 问哪些位置能够选 思路: hash求前缀后缀.然后枚举位置 #include <cstdio ...

  7. C#--动态操作DataTable

    C#动态操作DataTable(新增行.列.查询行.列等) 方法一:动态创建一个DataTable ,并为其添加数据 public void CreateTable()        {        ...

  8. node 设置自动启用定时任务控件 node-schedule

    [转]Quartz中时间表达式的设置-----corn表达式 时间格式: <!-- s m h d m w(?) y(?) -->,   分别对应: 秒>分>小时>日&g ...

  9. 怎么会float交换器int

    最近突然想知道编译器整数浮球开关是如何实现的,现在很多信息,但遗憾的是甚至没有这方面的记录,所以我决定实现自己的简单的整数浮点转 随着float开启int为例  double转int类似 在做强转之前 ...

  10. LaTex 加粗(加黑)的方式

    1. 基本 LaTeX技巧458:关于LaTeX数学字体加粗 $\mathbf $,会变为粗体,但也导致数学字母斜体形式的丢失: 使用 amsmath package 的 \boldmath 命令: ...