现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

制作带MFC界面的MFC DLL

2015-06-25 17:43 工业·编程 ⁄ 共 1396字 ⁄ 字号 暂无评论

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

相关阅读

    ----VC++ MFC DLL动态链接库编写详解

一:工程创建步骤

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);

给我留言

留言无头像?