最近在做基于组件化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. OpenFlow Switch学习笔记(四)——Matching

    这次我们着重详述来自于网络中的数据包在OpenFlow Switch中与Flow Entries的具体匹配过程,以及当出现Table Miss时的处理方式,下面就将从这两方面说起. 1.Matchin ...

  2. PAT (Basic Level) Practise:1013. 数素数

    [题目连接] 令Pi表示第i个素数.现任给两个正整数M <= N <= 104,请输出PM到PN的所有素数. 输入格式: 输入在一行中给出M和N,其间以空格分隔. 输出格式: 输出从PM到 ...

  3. PAT (Basic Level) Practise:1004. 成绩排名

    [题目链接] 读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式:每个测试输入包含1个测试用例,格式为 第1行:正整数n 第2行:第1个学生的姓名 学号 成绩 第3 ...

  4. 相对URL拼接为绝对URL的过程

    URL有两种方式:绝对的和相对的. 绝对URL中包含有访问资源的所需的全部信息 举一个例子: <HTML> <HEAD><TITLE>Joe's Tools< ...

  5. Y_TEXT001-(保存长文本)

    DATA: gs_header TYPE thead .DATA: gt_ltxts TYPE STANDARD TABLE OF tline .DATA: lw_ltxt TYPE tline . ...

  6. Matlab位运算笔记

    本文为转载其他地方的文章; MATLAB函数 1.matlab函数bitset 设置数的某一位二进制位为1. <Simulink与信号处理> 使用方法 C = bitset(A,bit) ...

  7. 227. Basic Calculator II

    Implement a basic calculator to evaluate a simple expression string. The expression string contains ...

  8. Codeforces Round #303 (Div. 2) B 水 贪心

    B. Equidistant String time limit per test 1 second memory limit per test 256 megabytes input standar ...

  9. Win 環境構建調試用TreeWalker

    語法 var ppTreeWalker = document.createTreeWalker(pRootNode, ulWhatToShow, pFilter, fEntityReferenceEx ...

  10. ES6-函数扩展