如何制作带MFC界面的MFC DLL

最近在做基于组件化MFC界面的开发,需要把界面封装到动态库中。

一:工程创建步骤

1.创建MFC DLL工程,选择 “在共享 DLL 中使用 MFC”。

2.运行时库选择:c/c++-->代码生成-->运行库  “多线程调试 DLL (/MDd)”。

二:定义导出界面基类

定义导出界面接口类,待导出界面需要继承该接口类,并实现该接口定义的虚函数。如下:

class IHpDllWin :public CDialog

{

public:

// 构造函数,ID为窗口资源ID

IHpDllWin(int id):CDialog(id){}

// 初始化,如客户端网络环境

virtual void Init(const char* svrip,const int port)=0;

// 清理,如客户端网络环境

virtual void Finit()=0;

// 显示窗口

virtual int ShowWin()=0;

// 设置参数

virtual void SetParam(string p1)=0;

};

该接口类继承于CDialog,所有导出的界面也只能是对话框,如果需要导出其他类型窗口类,修改该基类继承的窗口类。

三:定义导出接口

动态库将定义一个导出函数,该函数返回导出界面基类的指针。在外部获得该导出界面对象指针,可以对该界面进行操作。如:

下面的导出函数在动态库的app类的实现文件中添加,否则对话框关闭时报断言错误。

// 定义导出接口

extern "C" __declspec(dllexport) IHpDllWin* GetSelOrgControl()

{

// 切记,此处需要加下面这行代码,不然对话框显示不出来。

AFX_MANAGE_STATE(AfxGetStaticModuleState());

IHpDllWin *ph = App_SelOrgDlg::instance();

return ph;

}

四:调用方式

采用动态方式调用该动态库,调用步骤如下:

1.加载动态库

HINSTANCE  m_hDll = LoadLibrary("SelectOrgControl.dll");

if (NULL == m_hDll)

{

MessageBox("加载 SelectOrgControl.dll 失败");

}

2.获取导出函数指针

typedef IHpDllWin* (*hpDllFun)();

hpDllFun pShowDlg = (hpDllFun)GetProcAddress(m_hDll,"GetSelOrgControl");

if (NULL==pShowDlg)

{

MessageBox("DLL中函数寻找失败");

return;

}

3.获取导出类对象指针

IHpDllWin* m_hpwin = pShowDlg();

获取导出窗口类指针,获取了对该导出窗口的控制。

4.  向导出窗口传递参数

m_hpwin->SetParam(theApp.m_UsrName.GetBuffer());

5. 调用导出窗口的初始化函数

m_hpwin->Init("127.0.0.1",25250);

6. 显示导出窗口

m_hpwin->ShowWin();

五:卸载动态库

在使用完之后,调用下面函数卸载动态库:

FreeLibrary(m_hDll);

时间: 2024-08-01 12:49:20

如何制作带MFC界面的MFC DLL的相关文章

NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))

NX二次开发API里没有对EXCAL读写操作的相关函数,市面上有很多种方法去实现,比如UFUN调KF,ODBC,OLE(COM组件)等等.这里我是用的OLE(COM组件)方式去做的,这种在VC上创建的方法,无论C++还是C#还是VB方式思路都是一样的.先介绍用MFC去做,然后在写一篇博客介绍怎么在NX的二次开发的向导模板里去做.NX二次开发-基于NX开发向导模板的NX对Excel读写操作(OLE方式(COM组件))https://ufun-nxopen.blog.csdn.net/article

MFC程序加载DLL文件时运行到Loadlibray()语句就无法继续下去

我在学习Detour时,为了进行测试,就建立了一个DLL文件和一个MFC工程. 但是我的MFC程序加载DLL文件时运行到Loadlibray("XXX.dll")这条语句就无法继续下去,没有报错,VS2010也没有停止,还是处于编译运行状态. 可是我之前加载的别的DLL文件都可以运行,这应该是很简单的加载DLL文件的过程呀,就想是dll文件的代码错误?或是MFC工程错误?还是Dll工程错误? 于是 我就将dll内的代码 复制到原来可以运行的DLL文件中发现可以运行,那就是代码没错, 接

区别:Use MFC In A Shared DLL 和 Use MFC In A Static Library

摘自:Programming Windows with MFC, 2nd Edition Choosing Use MFC In A Shared DLL minimizes your application's executable filesize by allowing MFC to be accessed from a DLL. If you choose Use MFC In A StaticLibrary instead, Visual C++ links MFC code into

MFC 关于动态库DLL引用CDialog的关键点

,在MFC的应用开发中,经常会遇到将部分功能以DLL动态库的方式进行封装调用,在调用的过程中应注意以下几点 1 设置当前资源句柄 在DLL中查找资源文件时,如需要将当前资源文件的handle设置成dll模块的hinstance. AfxGetResourceHandle() 查看当前资源句柄 AfxSetResourceHandle() 设置当前资源句柄 GetModuleHandle(“dll文件名”); 例示: HINSTANCE h1 = AfxGetResourceHandle(); H

使用Less制作带箭头提示框

这里使用Less来制作带箭头的提示框,跟css比起来,方便多了,可以剩下很多的代码,别的不扯了,先看看效果吧. 这里我实现了4个方向的提示框,下面是具体实现代码: 提示框代码: <div class="top_prompt"> <div class="top_triangle"> <span class="line"></span> <span class="back"&g

setup界面的network configuration 进不去的原因

setup界面的network configuration 进不去的原因 这个问题在百度上搜了好久都没搜到能解决的答案,最后还是自己琢磨出来的. 目前我遇进不去的原因是,因为在刚装好系统(装的是最小化的)后直接暴力装的system-config-network-tui,导致缺少依赖包,造成了点不进去. 解决办法: rpm-qa | grep 'system-config-network-tui' 查看所有安装包并过滤出网络安装包            rpm-e system-config-ne

Android新浪微博客户端(六)——Home界面的ListView

原文出自:方杰|http://fangjie.sinaapp.com/?p=184转载请注明出处 最终效果演示:http://fangjie.sinaapp.com/?page_id=54该项目代码已经放到github:https://github.com/JayFang1993/SinaWeibo 一.首先是ListView的adapter. 因为微博列表的Item不是规则的,比如说有些微博有转发子微博,有些没有,有些有图片,有些没有图片,所以说很不固定.这里就采用BaseAdapter,要自

Linux环境下使用图形化界面的SVN客户端软件-RabbitVCS

如果想在Linux环境下使用图形化界面的SVN客户端软件,那么RabbitVCS绝对是首选,可以媲美Windows环境下用的TortoiseSVN,甚至连操作都基本一样,所以强烈推荐给各位童鞋. RabbitVCS基本支持所有的Linux发行版本包括Ubuntu.Debian.Fedora.Arch Linux.Gentoo.Mandriva.OpenSUSE.RHEL.CentOS 5等.其官网地址为http://www.rabbitvcs.org/ 在ubuntu下安装 首先添加源: sud

C++MFC编程笔记day06 MFC向导、MFC绘图类使用

MFC绘图 MFC绘图类包括绘图设备类和绘图对象类 1 绘图设备类 CDC类-父类是CObject,封装的是一般的绘图设备,例如:显示器, 打印机等. CWindowDC类-父类是CDC类,封装的是窗口对象,包括客户区和非 客户区. CClientDC类-父类是CDC类,封装的仍然是窗口,但是只包括客户区. CPaintDC类-父类是CDC类,封装的是窗口的客户区.但是,它只用 在窗口的WM_PAINT消息处理函数中. CMetaFileDC类-父类是CDC类,作用保存绘制命令. 2 使用 创建