我有两个项目:一个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);
但这只会导致对话框出现,但是单击控件(即按钮)时不会执行任何操作,因为它没有CToolboxDiag
与.exe中定义的链接。
我想导出对话框(带有按钮代码),而不必将类定义导出到.exe。换句话说,我想导出一个功能齐全的对话框,包括其按钮动作,而无需CToolboxDialog
在我的.exe上定义,以便可以将其完全模块化。我该怎么办?
这不能以这种方式工作。资源模板没有直接连接到DLL中的代码。您的代码刚刚创建了一个“空” CDialog类,没有所有处理程序,需要默认处理程序(OnOk,OnClose ...)
因此,您需要创建对象CToolboxDiag,并且这必须在对话框代码所在的位置进行。这在DLL中。
最简单的方法是导出一个函数,该函数仅在DLL中创建对话框,然后将CDialog *返回给您的应用程序。
请注意,这仅允许使用,并且在使用MFC的DLL共享版本时不会出现问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句