欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

在动态链接库dll中调用对话框

程序员文章站 2022-07-14 11:22:38
...

效果:在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工程的“属性”,在左边选择“链接器”|“常规”,在右边的附加库目录中输入“(SolutionDir)(SolutionDir)(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)保存工程并运行,结果如下图所示:
在动态链接库dll中调用对话框
点击“获取信息”按钮,弹出的对话框中输入IP及端口号,点击“确认”按钮。
在动态链接库dll中调用对话框
在动态链接库dll中调用对话框