编写DLL
1.创建一个MFC DLL,选择“使用共享MFC DLL的规则DLL”,完成
2.运行时库选择:属性-->c/c++-->代码生成-->运行库 “多线程调试 DLL (/MDd)”.好像是默认的
3.项目属性中添加新的MFC类 类名自定义 如IHpDllWin, 选择基类:CDialog,点击完成
4.该动态库中需要实现一个导出函数,该函数返回的是导出界面所属基类的指针。在xxxDlg.cpp中实现导出函数
// 定义导出接口
extern "C" __declspec(dllexport) IHpDllWin* ShowDialog()
{
// 此处需要加下面这行代码,不然对话框显示不出来。
AFX_MANAGE_STATE(AfxGetStaticModuleState());
IHpDllWin *ph = new IHpDllWin;
ph->Create(IHpDllWin::IDD);
ph->ShowWindow(SW_SHOW);
return ph;
}
5.点击生成DLL。Debug中出现.dll和.lib
调用DLL
调用dll时使用动态调用的方式
1.创建一个基于对话框的MFC工程
2.将之前生成的.dll和IHpDllWin.h 复制到工程目录下,并添加 #include IHpDllWin.h
3.在响应函数中实现调用
//1.加载动态库
HINSTANCE m_hDll = LoadLibrary(_T("MFCDLL1.dll"));
if (NULL == m_hDll)
{
int ret = GetLastError();
MessageBox(_T("加载 MyDLL.dll 失败"));
}
//2.获取导出函数指针
typedef IHpDllWin* (*hpDllFun)();
hpDllFun pShowDlg = (hpDllFun)GetProcAddress(m_hDll, "ShowDialog");//获取函数地址
if (NULL == pShowDlg)
{
MessageBox(_T("DLL中函数寻找失败"));
return;
}
//3.获取导出类对象指针
IHpDllWin* m_hpwin = pShowDlg(); //获取导出窗口类指针,获取了对该导出窗口的控制。
4.生成exe。这时会出现“未定义的标识符IDD=IDD_IHPDLLWIN”。此时需要在IHpDllWin.h头部位置添加定义 #define IDD_IHPDLLWIN 8000
5.再次编译生成exe,可成功连接并弹出对话框