DLL

时间:2015-04-22 16:27:53

标签: c++ visual-c++ dll mfc

我有两个项目:一个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定义,这样就可以完全模块化了。我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

这不能以这种方式运作。资源模板与DLL中的代码没有直接连接。你的代码刚刚创建了一个空的"没有处理程序帽子的CDialog类,期望默认处理程序(OnOk,OnClose ...)

因此,您需要创建对象CToolboxDiag,这必须在对话框代码所在的位置发生。这是在DLL内部。

最简单的方法是导出一个只在DLL中创建对话框的函数,然后只将CDialog *返回给你的应用程序。

请注意,这只是允许的,并且在使用MFC的DLL共享版本时可以正常工作。