最近在做基于组件化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);

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

  1. 编写带对话框界面的OCX

    编写带对话框界面的OCX步骤: 1.添加Dialog资源,切换到资源视图,将对话框的Style设置为Child,在对话框界面右击添加类,输入类名MyDlg,使得其继承与CDialogEx.(继承CDi ...

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

    NX二次开发API里没有对EXCAL读写操作的相关函数,市面上有很多种方法去实现,比如UFUN调KF,ODBC,OLE(COM组件)等等.这里我是用的OLE(COM组件)方式去做的,这种在VC上创建的 ...

  3. 轻量级Web API实现,带接口界面的Jayrock JsonRPC接口组件升级版

    升级功能如下: 1.增加模块名称.输入参数.输出参数注释 2.增加Sign验证.输入数据解密.输出数据解密重写方法 3.增加集成Demo规范 4.增加模块分类.接口快速定位.接口调用说明.接口输入输出 ...

  4. 自定义序列化4 (MFC调用C#的.dll)

    CLR:CLR常用简写词语,CLR是公共语言运行时,Common Language Runtime)和Java虚拟机一样也是一个运行时环境,它负责资源管理(内存分配和垃圾收集),并保证应用和底层操作系 ...

  5. MFC调用c#的dll

    一.使用 /clr 编译 MFC 可执行文件或规则 DLL 1.打开“项目属性”对话框,方法是右键单击“解决方案资源管理器”中的项目并选择“属性”. 2.展开“配置属性”旁边的节点并选择“常规”.在右 ...

  6. 区别: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 applica ...

  7. Dynamic Property Wizard 添加类提示 ATL类只能添加到MFC EXE 和MFC规则DLL项目或完全支持ATL的项目 错误提示解决方式

    在重新打开OPM项目添加ATL动态属性向导Dynamic Property Wizard提示错误 ATL类只能添加到MFC EXE 和MFC规则DLL项目或完全支持ATL的项目. 有效的解决方式,右键 ...

  8. 如何自定义wordpress登录界面的Logo

    每次登录wp后台都会看到wordpress的logo,会不会有点烦呢?想不想换个新的.自己设定一个呢?那么如何自定义wordpress登录界面的Logo呢? 把代码复制到当前主题的 functions ...

  9. 【Xamarin 挖墙脚系列:IOS 开发界面的3种方式】

    原文:[Xamarin 挖墙脚系列:IOS 开发界面的3种方式] xcode6进行三种基本的界面布局的方法,分别是手写UI,xib和storyboard.手写UI是最早进行UI界面布局的方法,优点是灵 ...

随机推荐

  1. 修改数据库mysql字符编码为UTF8

    Mysql数据库是一个开源的数据库,应用非常广泛.以下是修改mysql数据库的字符编码的操作过程. 步骤1:查看当前的字符编码方法 mysql> show variables like'char ...

  2. Java线程的生命周期

    线程的生命周期包括:新建(New).就绪(Runnable).运行(Running).阻塞(Blocked)和死亡(Dead)5种状态.线程状态转换图如下: 1.新建状态(New) 当程序使用new关 ...

  3. 行为识别笔记:HOG,HOF与MBH特征(转载)

    在行为识别的iDT算法中,主要使用了HOG,HOF,MBH和Dense Trajectory四种特征.这里主要对前三者进行介绍. 1. HOG特征(histogram of gray) 此处HOG特征 ...

  4. MACOS,LINUX,IOS上可用的毫秒级精度时间获取

    二话不说,先上代码 void outputCurrentTime(uint32_t seq,const char* type){ struct timeval t_curr; gettimeofday ...

  5. sqlite字符反向模糊查找

    sqlite 一个短字符要去db里模糊查找时,可以用like 如select * from t_contact where uphone like '%1234%'; 但是当输入的字符串超过数据库里的 ...

  6. ES6-函数扩展

  7. Roman to Integer

    Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 t ...

  8. Oracle数据库Linux下的导出EXP

    先转一篇 ================================我是分割线================================ 时间:2013-06-22 13:48来源:未知 ...

  9. Eclipse中web-inf和meta-inf文件夹的信息

    http://www.cnblogs.com/chinafine/archive/2010/06/13/1757514.html WEB-INF     /WEB-INF/web.xml        ...

  10. kuangbin_ShortPath F (POJ 3259)

    判环模板题 有了上一题的经验过得很轻松 除了因为spfa还不是很熟打错了两个字母 然后debug了一小会 #include <iostream> #include <string&g ...