当前位置: 代码迷 >> QT开发 >> 将QT开发的界面程序打包成DLL,在VC中成功调用
  详细解决方案

将QT开发的界面程序打包成DLL,在VC中成功调用

热度:78   发布时间:2016-04-25 04:23:02.0
将QT开发的界面程序封装成DLL,在VC中成功调用
最近手头的一个项目需要做一个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发布接口函数的部分修改为如下所示:

   extern "C" __declspec(dllexport) int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    ****** w;
    w.show();
    return a.exec();
}
    其中******是你界面文件的.h文件中定义的界面类名
    这样我们得DLL就做好了,然后点构建,就可以生成封装了QT界面并且可以用VC调用的DLL了

     在CSDN的第一篇技术贴,说的不详细的大家有什么不懂的可以问我,文章中有什么不对的欢迎大牛指教
------解决方案--------------------
原来要把main函数导出啊……
还没用Qt做过dll……
------解决方案--------------------
用QT做DLL在Qt程序里面调不需要这么麻烦,直接把DLL的类导出来就能使用

如果VC调用的话,是不是调用一下QApplication就行了,而并不一定非要导出main函数?
------解决方案--------------------
学习了~
------解决方案--------------------
楼主厉害
------解决方案--------------------
引用:
用QT做DLL在Qt程序里面调不需要这么麻烦,直接把DLL的类导出来就能使用

如果VC调用的话,是不是调用一下QApplication就行了,而并不一定非要导出main函数?

分享一下经验啊...
------解决方案--------------------
不错啊    
------解决方案--------------------
不知道可否实现 将QT某个控件附加到win32 api或者MFC创建的窗口上。。。
------解决方案--------------------
无法找到执行档,请指定下一个。是什么意思啊
------解决方案--------------------
DLL入口函数不是DllMain么,你导出main干嘛使呢?
既然说是技术贴,一个例子也没有。我还说跟人交流。狗屁,发个贴就没影了。
------解决方案--------------------
求问下楼主,怎么在QT下使用QwinHost,就是调用MFC的东西
------解决方案--------------------
我想在VS里调用Qt界面类的DLL,可以成功调用了,问题是,Qt程序调用后,就进入了Qt的事件循环,无法再调用我Qt中导出的其他接口(与界面程序进行数据交互用),因此我采用多线程的方法,一个线程跑界面Qt程序,在Vs的另一个线程中调用其他接口,问题出现了,老是提示“Debug Error! Run-Time check Failure #0 - The value of ESP was not properly saved across a function call.This is usually a result of calling a function declared with one calling convertion with a function pointer declared with a different calling convertion.”
  相关解决方案