通过点击父窗口某个控件调用子界面,子界面的调用方式是:将子界面的dll文件名称、类名和导出函数名传递给父界面对应的函数,并最终返回子界面的参数给父界面。
1、用于从动态链接库(DLL)中获取函数指针并调用该函数
int CParentDlg::GetChildParameterFun(HINSTANCE m_hDll, CString className, CString funName) //参数包括DLL实例句柄 m_hDll,类名 className 和函数名 funName。
{
// 获取导出函数指针
if (strcmp(className, "CTestDlg") == 0)
{
typedef void (*hpDllFun)(std::vector<CString>*); //定义一个函数指针类型 hpDllFun,该函数指针指向的函数接受一个 std::vector<CString>* 类型的指针
hpDllFun pShowDlg = (hpDllFun)GetProcAddress(m_hDll, funName); //从DLL中获取名为 funName 的函数指针,并将其转换为 hpDllFun 类型。
if (NULL == pShowDlg)
{
MessageBox("DLL中函数寻找失败");
return 0;
}
// 获取导出类对象指针
std::vector<CString>* parameters = new std::vector<CString>(); //创建一个新的 std::vector<CString> 对象,用于存储参数。
pShowDlg(parameters); //调用获取的函数指针,传入 parameters
FreeLibrary(m_hDll); //释放DLL。
}
}
2、定义了一个导出函数 TestDlg,用于显示一个模态对话框 CTestDlg ,并将对话框的输出结果传递给调用者提供的 parameters容器
//这是一个C风格的导出函数,返回类型为 void,参数为 std::vector<CString>* parameters。
extern "C" __declspec(dllexport)void TestDlg(std::vector<CString>* parameters)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CTestDlg dlg();
dlg.DoModal(); //以模态对话框的方式显示 dlg。模态对话框会阻塞调用线程,直到对话框关闭。
parameters->assign(dlg.parameters.begin(), dlg.parameters.end()); //将对话框 dlg 中的 parameters 结果赋值给传入的 parameters 容器。
}