关闭

【转载】MFC 下调用Qt编写的含界面的dll / 蓝讯 http://www.lxway.com/994246544.htm

标签: Qtqt-solutions-ov3r1oaDLL调用VC++
455人阅读 评论(0) 收藏 举报
分类:

【转载】MFC 下调用Qt编写的含界面的dll / 蓝讯

lxway.com
原文来源:http://www.lxway.com/994246544.htm  感谢原作者解决了我遇到的问题

        接到任务要做一个既可以在Qt下又可以在VC,C#下使用,且含有界面的dll封装形式的组件, 纠结了大概四五天的样子,找遍了整个互联网,这方面的资料太少了,仅有一两个被转载了n多遍的没有新意的介绍,且实用性不强,本人经过数天摸索成功在VC下调用Qt编译的带界面的DLL。

首先强调一下环境:

操作系统:                     win8

VS   版本:                     VS2010

Qt    版本:                     qt-opensource-windows-x86-mingw482_opengl-5.3.0.exe

qtwinmingrate版本:   qt-solutions-ov3r1oads-qt-solutions 此版本较为新,2.8 在Qt5下用不了。

                                         下载地址:https://qt.gitorious.org/qt-solutions/ov3r1oads-qt-solutions/source/80592b0e7145fb876ea0e84a6e3dadfd5f7481b6:

参考:1,http://blog.csdn.net/normallife/article/details/5397980

            2, http://www.rebaoxian.com/28649.html

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

参考十分有限而且粗略,不适合新手来做,没有例子,没有详细的代码。且所用Qt版本老旧

我的工作

1 首先安装好Qt5.3, 这个不用多说。

2 下载下来qt-solutions-ov3r1oads-qt-solutions 解压后进入D:\qt-solutions-ov3r1oads-qt-solutions\qtwinmigrate\examples\qtdll 目录,该目录下面有qtdll.pro工程文件 用       qt5.3打开该文件。

3 测试是否可以进行编译,上述文件后在Qtcreater 中构建,或者编译该项目,编译通过后会弹出下图所示自定义执行档对话框,此种情况很正常,因为是dll 项目无程序入口qt让指定入口,关闭即可。第一次编译出现此界面,随后就不会出了,关闭后找到dll生成目录我的机子上为D:\qt-solutions-ov3r1oads-qt-solutions\qtwinmigrate\examples\build-qtdll-Desktop_Qt_5_3_0_MinGW_32bit-Debug\debug 如果成功该目录下会有我们期待已久的qtdialog.dll。MFC 下调用Qt编写的含界面的dll
   MFC 下调用Qt编写的含界面的dll

  4  上述步骤顺利的话说明你的可以往下进行了。我开始的理解是这个qtdialog.dll 即使我所需要的,将它拷贝出来就可以用了,可实践证明我想多了。用VS2010建了一个MFC工程进行测试,测试例子很简单就一个基于对话框的界面上面放一个按钮,按钮事件是调用该dll.  

HMODULE  mod = LoadLibrary( "qtdialog.dll" );
	DWORD  err= GetLastError();
	 if ( mod ) { typedef BOOL(*pShowDialog)(HWND parent);
		 pShowDialog showDialog = (pShowDialog)GetProcAddress( mod, "showDialog" );
		 if ( showDialog )
			 showDialog( theApp.m_pMainWnd->m_hWnd );

		 FreeLibrary( mod );
	 } else {
		 CAboutDlg aboutDlg;
		 aboutDlg.DoModal();
	 }


    接下来就是一个痛苦的过程了,

        问题1:无论如何也不能加载qtdialog.dll ,mod 的值始终都是0, 工程目录下明明有该dll文件。

            解决办法: 调用   LoadLibrary();后立马调用GetLastError()得到错误码,分析错误码。

            错误码为126 意思是无法加载相应模块。这可怎么办呢?后来想想是不是dll依赖的一些qt的库没有过来导致的,遂使用Depends.exe查看该dll的依赖项,果不其然依赖挺多的后将各个依赖项在qt的安装目录下通过搜索找到放到MFC工程目录下。找到这些后还会提示有依赖项,总之把所有的依赖项添加完毕我一共添加了下图那么多可能有些是多余的。当然这是debug版本下的都带了个d.因为这个依赖项的问题搞了整整一天!

     MFC 下调用Qt编写的含界面的dll
  MFC 下调用Qt编写的含界面的dll

        问题2:依赖问题解决了也能载入dll了而且mod不为空,而且能够得到showDialog()函数的地址 但是一直出这样的错误,太坑爹了,不知道什么原因呀!!

                          MFC 下调用Qt编写的含界面的dll

                    解决办法:首先尝试了各种方法,下载旧版本的VC运行时,修复dll ............总之就差重装系统了,没有解决,最后想想是不是这种调用方法有问题?

                                        按照参考2 中的方法试一下。

                                        打开qtdll工程,打开源文件中的main.cpp 备用,然后右键单击qtdll工程添加新文件“qt界面设计师类”继承与mainwindow 类当然也可以是其他的界面类,

                                        在界面上随意放置两个组件,如button,label等

                                        然后将main函数中的下面一段:                           

//extern "C" __declspec(dllexport) bool showDialog( HWND parent )
//{
//    QWinWidget win( parent );
//    win.showCentered();
//    QMessageBox::about( &win, "About QtMfc", "QtMfc Version 1.0\nCopyright (C) 2003" );
//    return TRUE;
//}

                    换成

extern "C" __declspec(dllexport)int main(int argc, char *argv[])
{
 QApplication a(argc, argv);
 MyJieMian w;
 w.show();
 return a.exec();
} 

     重新编译通过。重新将生成的dll文件拷贝到MFC测试工程中

5   测试成功         

    将MFC按钮响应程序改为下述代码

void CMFCDLLDlg::OnBnClickedButton1()
{
	// TODO: Add your control notification handler code here
	HMODULE  mod = LoadLibrary( "qtdialog.dll" );
	DWORD  err= GetLastError();
	 if ( mod ) {
	 typedef int (*Mymain)(int argc, char *argv[]);
		 Mymain mmain= (Mymain)GetProcAddress(mod,"main");
		
		char* b="abc";
		chara=&b;
		 mmain(0,a);
		 FreeLibrary( mod );
	 } else {
		 CAboutDlg aboutDlg;
		 aboutDlg.DoModal();
	 }
}

按下MFC中的按钮奇迹出现了,虽然丑了点但是还是出现了Qt下设计好的界面了

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

外部程序调用Qt5带界面的dll

外部程序(MFC、VC++控制台程序)调用Qt5带界面的dll
  • shuishanga
  • shuishanga
  • 2016-08-12 09:37
  • 3009

MFC 下调用Qt编写的含界面的dll

接到任务要做一个既可以在纠结了好几天了,
  • libin88211
  • libin88211
  • 2014-07-27 23:23
  • 3765

在MFC中使用Qt生成的DLL

http://doc.qt.digia.com/solutions/4/qtwinmigrate/winmigrate-walkthrough.html(原文地址) (qtwinmigrate-2....
  • suifenghuidong
  • suifenghuidong
  • 2013-09-25 23:16
  • 3659

MFC 下调用Qt编写的含界面的dll

接到任务要做一个既可以在纠结了好几天了,
  • libin88211
  • libin88211
  • 2014-07-27 23:23
  • 3765

揭开正则表达式的神秘面纱(转自:http://www.regexlab.com/zh/regref.htm)

引言    正则表达式(regular expression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。比如 表达式“ab+” 描述的特征是“一个 a 和 任意个...
  • lslxdx
  • lslxdx
  • 2011-06-16 22:15
  • 476

Android NDK 开发环境搭建(二)----来源http://www.cnblogs.com/zdz8207/archive/2012/11/27/android-ndk-install.htm

随笔- 116  文章- 0  评论- 106  android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创) ...
  • zhangdong305
  • zhangdong305
  • 2015-04-11 20:16
  • 486

字符,字节和编码转自http://www.regexlab.com/zh/encoding.htm]

摘要:本文介绍了字符与编码的发展过程,相关概念的正确理解。举例说明了一些实际应用中,编码的实现方法。然后,本文讲述了通常对字符与编码的几种误解,由于这些误解而导致乱码产生的原因,以及消除乱码的办法。本...
  • wonengchuangzaoqij
  • wonengchuangzaoqij
  • 2012-12-04 18:08
  • 259

ubuntu中xen-tools安装半虚拟化的虚拟机(转自http://www.linuxidc.com/Linux/2012-04/58209.htm)

Ubuntu 11.10中可以通过apt-get安装xen-tools,其版本为4.1版本: # apt-get install -y xen-tools 由于xen-tools是xen的半虚拟化...
  • q123456789098
  • q123456789098
  • 2012-08-02 20:25
  • 1002

http://www.regexlab.com/zh/regref.htm

  • Aquester
  • Aquester
  • 2012-07-24 16:18
  • 678

MFC的资源切换AFX_MANAGE_STATE (转载http://www.cnblogs.com/ntrgx/archive/2010/11/14/1877199.html)

MFC的资源切换AFX_MANAGE_STATE (转载)  如何实现DLL资源切换的?AFX_MANAGE_STATE(AfxGetStaticModuleState())这就是他们的答案,一如微...
  • xbsoul
  • xbsoul
  • 2016-12-18 10:08
  • 466
    个人资料
    • 访问:1306次
    • 积分:39
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:3篇
    • 译文:0篇
    • 评论:0条
    文章分类