MFC 从 DLL 导入对话框
MFC import Dialog from DLL
我有两个项目:一个 MFC .exe 和一个 MFC .dll。我有一个在 DLL 中定义的 MFC 对话框。它有一个与之关联的资源,它还有一个从 CDialog
派生的 class CToolboxDiag
。
该对话框有一个简单的按钮,单击它会显示一个消息对话框。
void CToolboxDiag::OnBnClickedButton()
{
MessageBox(_T("Test"), _T("T"));
}
我可以将资源从 DLL 导出到我的代码,并使用以下代码创建具有正确外观的标准 CDialog
:
CDialog *diag = new CDialog;
HINSTANCE hClientResources = AfxGetResourceHandle();
//Tell the client to use the .DLL's resources
AfxSetResourceHandle(dll);
// resource_id is the resource_id in the DLL
diag->Create(resource_id, NULL);
//Restore the client application resource handle
AfxSetResourceHandle(hClientResources);
但这只会导致对话框出现,但控件(即按钮)在单击时不执行任何操作,因为它没有链接到 .exe 中的 CToolboxDiag
定义。
我想导出对话框(带有按钮代码)而不必将 class 定义导出到 .exe。换句话说,我想导出一个功能齐全的对话框,包括它的按钮操作,而不需要在我的 .exe 上定义 CToolboxDialog
,这样它就可以完全模块化。我该怎么做?
这种方式不行。资源模板与 DLL 中的代码没有直接联系。您的代码刚刚创建了一个 "empty" CDialog class,它没有任何处理程序,期望默认处理程序(OnOk、OnClose...)
所以您需要创建对象 CToolboxDiag 并且这必须在对话代码所在的位置发生。这是在 DLL 中。
最简单的方法是导出一个只在 DLL 中创建对话框的函数,并且 returns 一个 CDialog* 到您的应用程序。
请注意,只有当您使用 MFC 的 DLL 共享版本时才允许这样做,并且不会出现问题。
我有两个项目:一个 MFC .exe 和一个 MFC .dll。我有一个在 DLL 中定义的 MFC 对话框。它有一个与之关联的资源,它还有一个从 CDialog
派生的 class CToolboxDiag
。
该对话框有一个简单的按钮,单击它会显示一个消息对话框。
void CToolboxDiag::OnBnClickedButton()
{
MessageBox(_T("Test"), _T("T"));
}
我可以将资源从 DLL 导出到我的代码,并使用以下代码创建具有正确外观的标准 CDialog
:
CDialog *diag = new CDialog;
HINSTANCE hClientResources = AfxGetResourceHandle();
//Tell the client to use the .DLL's resources
AfxSetResourceHandle(dll);
// resource_id is the resource_id in the DLL
diag->Create(resource_id, NULL);
//Restore the client application resource handle
AfxSetResourceHandle(hClientResources);
但这只会导致对话框出现,但控件(即按钮)在单击时不执行任何操作,因为它没有链接到 .exe 中的 CToolboxDiag
定义。
我想导出对话框(带有按钮代码)而不必将 class 定义导出到 .exe。换句话说,我想导出一个功能齐全的对话框,包括它的按钮操作,而不需要在我的 .exe 上定义 CToolboxDialog
,这样它就可以完全模块化。我该怎么做?
这种方式不行。资源模板与 DLL 中的代码没有直接联系。您的代码刚刚创建了一个 "empty" CDialog class,它没有任何处理程序,期望默认处理程序(OnOk、OnClose...)
所以您需要创建对象 CToolboxDiag 并且这必须在对话代码所在的位置发生。这是在 DLL 中。
最简单的方法是导出一个只在 DLL 中创建对话框的函数,并且 returns 一个 CDialog* 到您的应用程序。
请注意,只有当您使用 MFC 的 DLL 共享版本时才允许这样做,并且不会出现问题。