最后的头文件为:(其中绿色为向导添加的,红色为手工添加的)
// ExtClientDlg.h : 头文件 //
#include \#pragma once
// CExtClientDlg 对话框
class CExtClientDlg : public CDialog { ?? public: };
在客户对话框类的初始化对话框成员函数OnInitDialog中,手工添加设置数据编辑框初值的代码(红色部分):
BOOL CExtClientDlg::OnInitDialog() {
int m_iData1; int m_iData2;
CCompute *m_pComp; void Comp(UINT nID);
afx_msg void OnBnClickedAdd(); afx_msg void OnBnClickedSub(); afx_msg void OnBnClickedMul(); afx_msg void OnBnClickedDiv(); afx_msg void OnBnClickedMod();
CDialog::OnInitDialog(); ??
// TODO: 在此添加额外的初始化代码 SetDlgItemInt(IDC_DATA1, 5); SetDlgItemInt(IDC_DATA2, 3);
16
}
代码文件ExtClientDlg.cpp中其他新加内容有:(其中红色部分为手工添加的)
void CExtClientDlg::OnBnClickedAdd() { }
void CExtClientDlg::OnBnClickedSub() { }
void CExtClientDlg::OnBnClickedMul() { }
void CExtClientDlg::OnBnClickedDiv() { }
void CExtClientDlg::OnBnClickedMod() {
17
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
// TODO: 在此添加控件通知处理程序代码 Comp(IDC_ADD);
// TODO: 在此添加控件通知处理程序代码 Comp(IDC_SUB);
// TODO: 在此添加控件通知处理程序代码 Comp(IDC_MUL);
// TODO: 在此添加控件通知处理程序代码 Comp(IDC_DIV);
}
// TODO: 在此添加控件通知处理程序代码 Comp(IDC_MOD);
void CExtClientDlg::Comp(UINT nID) { }
UpdateData(); // 动态获取用户输入的数据并赋值给对应的控件变量 m_pComp = new CCompute(m_iData1, m_iData2); // 创建计算对象 int r; double dr;
switch(nID) { // 进行四则和取模运算 }
delete m_pComp;
if (nID != IDC_DIV) SetDlgItemInt(IDC_RESULT, r); // 显示整数结果 else { // 显示除法所得的实数结果 }
wchar_t buf[20];
swprintf_s(buf, 20, L\SetDlgItemText(IDC_RESULT, buf); case IDC_ADD: r = m_pComp->Add(); break; case IDC_SUB: r = m_pComp->Sub(); break; case IDC_MUL: r = m_pComp->Mul(); break; case IDC_DIV: dr = m_pComp->Div(); break; case IDC_MOD: r = Mod(m_iData1, m_iData2); break;
20.2.7 编译运行
为了运行客户程序,需要将客户程序项目设置成启动项目。具体做法是,先在项目管理区中选中ExtClient项目,然后选择菜单项“项目\\设为启动项目”。
18
编译后,会在解决方案的Debug或Release目录中生成动态链接库文件ExtDll.dll和客户程序的可执行文件ExtClient.exe,以及DLL的导出文件ExtDll.exp和(静态连接)库文件ExtDll.lib。
运行结果如图20-9所示:
图20-9 客户程序ExtClient的运行结果
20.3 规则DLL
使用MFC编写的规则DLL,虽然只能导出函数而不能导出整个类,但是其导出的函数却可以被其他非MFC应用程序所调用。下面我们仍通过上面的四则运算的例子,看看如何用关键字__declspec(dllexport)和extern \来编写和使用导出若干(全局)C函数的规则MFC DLL。
20.3.1 创建DLL项目
我们创建一个名为RegDll的规则DLL的“Visual C++”之“MFC”的“MFC DLL”项目,注意仍需选中“创建解决方案的目录”复选框,参见图20-10。
19
图20-10 新建MFC DLL项目RegDll的对话框
按“确定”钮,弹出“MFC DLL向导”对话框。在“DLL类型”栏中,选中“使用共享MFC DLL的规则DLL”单选钮,参见图20-11。按“完成”钮,创建RegDll解决方案和项目。
图20-11 选择规则DLL的MFC DLL向导对话框
也可以选择“带静态链接MFC的规则DLL”,差别是所生成的DLL中会包含MFC库,当然所生成的库文件也会大一些(但因此可不用另外安装MFC动态链接库)。例如,在此例中,选共享MFC所生成的RegDll.dll文件只有13KB大,而选择静态MFC的则有199KB。
20