我有两个项目:一个MFC .exe和一个MFC .dll。我有一个DLL中定义的MFC对话框。它有一个与之关联的资源,并且还有一个从CToolboxDiag
派生的类CDialog
。
该对话框有一个简单的按钮,单击时会显示一个消息对话框。
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
定义的链接。
我想导出对话框(使用按钮代码),而不必将类定义导出到.exe。换句话说,我想导出一个功能齐全的对话框,包括其按钮操作,而不是在我的.exe上有CToolboxDialog
定义,这样就可以完全模块化了。我怎么能这样做?
答案 0 :(得分:2)
这不能以这种方式运作。资源模板与DLL中的代码没有直接连接。你的代码刚刚创建了一个空的"没有处理程序帽子的CDialog类,期望默认处理程序(OnOk,OnClose ...)
因此,您需要创建对象CToolboxDiag,这必须在对话框代码所在的位置发生。这是在DLL内部。
最简单的方法是导出一个只在DLL中创建对话框的函数,然后只将CDialog *返回给你的应用程序。
请注意,这只是允许的,并且在使用MFC的DLL共享版本时可以正常工作。