在动态链接库dll中调用对话框
效果:在dll中创建对话框,并在dll的调用者中与对话框数据进行交互。
(1)新建一个基于对话框的MFC应用程序TestDlg,删除对话框中原有控件。
(2)在对话框上放置一个按钮“获取信息”,一个IP地址控件和一个编辑框,其中,编辑框用来存放获取到的端口。
为TestDlg工程的IP地址控件添加变量m_ip,并为编辑框添加变量m_port。
CIPAddressCtrl m_ip;
int m_port;
(3)切换到解决方案视图,新建一个MFC DLL工程,工程名是dlg,并在向导中选中“使用共享MFC DLL的规则DLL”。
(4)切换到资源视图,在dlg工程中添加一个对话框,并在对话框上放置一个IP地址控件和编辑框控件,设置IP地址控件的ID为IDC_IPADDRESS1_DLG,编辑框控件ID为IDC_TEST2。
(5)为dlg工程对话框添加类CDlgTest,然后为其添加成员变量:
CString m_strIP;
为dlg工程的IP地址控件添加变量m_ip,并为编辑框添加变量m_port。
CIPAddressCtrl m_ip;
int m_port;
然后为“确定”按钮添加事件处理函数,代码如下:
void CDlgTest::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
//CDialog::OnOK();
m_ip.GetWindowText(m_strIP);
OnOK();
}
(6)在dlg工程的dlg.def文件中输入导出函数名字show,并在dlg.cpp中添加show函数的实现,代码如下:
void show(CString &strIP,int &port)
{
//改变模块的状态
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CString str;
CDlgTest dlg;
char szip[20];
if(IDOK==dlg.DoModal())
{
//dlg.m_ip.GetWindowText(szip,20);//这样是错误的
strIP = dlg.m_strIP;
port = dlg.m_port;
}
}
在dlg.cpp中引入头文件:
#include "DlgTest.h"
在show函数里主要功能是显示对话框,然后把输入的ip和端口值赋值给引用参数,使外部调用者也能获取到。
(7)因为默认情况下,dlg工程生成的lib文件的路径是在解决方案debug目录下,所以首先在TestDlg工程里设置附件库的路径,打开TestDlg工程的“属性”,在左边选择“链接器”|“常规”,在右边的附加库目录中输入“(ConfigurationName)”。再在左边选择“链接库”|“输入”,然后在右边的附加依赖项中输入“dlg.lib”。
(8)切换到TestDlg工程的资源视图,为“获得信息”按钮添加事件处理函数,代码如下:
void CTestDlgDlg::OnBnClickedButton1() //获取信息
{
// TODO: 在此添加控件通知处理程序代码
CString strIP;
int port;
show(strIP,port);
m_ip.SetWindowText(strIP);
m_port = port;
UpdateData(FALSE);
}
并在TestDlg.cpp中添加show函数说明:
void show(CString &strIP,int &port);
(9)保存工程并运行,结果如下图所示:
点击“获取信息”按钮,弹出的对话框中输入IP及端口号,点击“确认”按钮。