解决扩展MFC DLL与主程序资源冲突问题
2007-08-12 19:59
375 查看
介绍这方面的文章不少,这里仅仅简明扼要提供代码和一些说明。
在要到处的MFC类加上AFX_EXT_CLASS,比如
class AFX_EXT_CLASS CMIVPToolDlg : public CDialog
即可形成到处类,用dumpbin查看发现几乎导出了所有的MFC函数,暂时不管他。
在客户端,也就是需要使用该MFC类的程序,加载方式,在工程中加入.lib库以及库目录设定。
对对话框而言,调用方式有两种:模态调用和动态创建。
两种方式都会遇到资源ID号冲突的问题,解决办法介绍如下:
1,模态调用
客户端使用doModal函数启动模态对话框,所以在导出类中重载该函数并修改如下:
INT_PTR CMIVPToolDlg::DoModal()
{
// TODO: Add your specialized code here and/or call the base class
HMODULE hDLL=GetModuleHandle(_T("MIVPToolbar.dll"));
HINSTANCE hEXE=AfxGetResourceHandle();
AfxSetResourceHandle((HINSTANCE)hDLL);
INT_PTR curp = CDialog::DoModal();
AfxSetResourceHandle(hEXE);
return curp;
}
其中MIVPToolbar.dll为导出类生成的动态链接库名字
这就解决了资源冲突问题。
2,动态创建
制作一个导出类的新的构造函数:
CMIVPToolDlg::CMIVPToolDlg(CWnd* pParent,UINT dType) // standard constructor
{
#ifndef _WIN32_WCE
EnableActiveAccessibility();
#endif
EnableAutomation();
HMODULE hDLL=GetModuleHandle(_T("MIVPToolbar.dll"));
HINSTANCE hEXE=AfxGetResourceHandle();
AfxSetResourceHandle((HINSTANCE)hDLL);
BOOL bCreated = CDialog::Create( IDD_FORMVIEW_TOOLDLG, pParent);
SUCCEEDED(bCreated);
AfxSetResourceHandle(hEXE);
}
在客户端动态创建方式非常简单,注意析构就可以了:
if( !m_toolbar1 )
{
m_toolbar1 = new CMIVPToolDlg(this,1);
}
m_toolbar1->ShowWindow(SW_SHOW);
3,通信
在扩展类中已经掌握了主类的指针,不成问题;同时,主类负责创建扩展类对象,拥有指针而且负责销毁对象。
4,宗旨
代码一样、思想更是一样。目的就是对面板进行封装,协作开发方便。比如,我要求某个哥们给我做个什么样的界面,提供的功能很单一,与其他模块的交互不多,那么就让他去起个exe工程,进行单独的编写和测试,然后我将他的工程通过这种方式做成dll库的方式供我主程序调用。
5, 讨论
这种方式的利弊还有待实践,有哥们说扩展MFC DLL仅适合做控件的扩展?
在要到处的MFC类加上AFX_EXT_CLASS,比如
class AFX_EXT_CLASS CMIVPToolDlg : public CDialog
即可形成到处类,用dumpbin查看发现几乎导出了所有的MFC函数,暂时不管他。
在客户端,也就是需要使用该MFC类的程序,加载方式,在工程中加入.lib库以及库目录设定。
对对话框而言,调用方式有两种:模态调用和动态创建。
两种方式都会遇到资源ID号冲突的问题,解决办法介绍如下:
1,模态调用
客户端使用doModal函数启动模态对话框,所以在导出类中重载该函数并修改如下:
INT_PTR CMIVPToolDlg::DoModal()
{
// TODO: Add your specialized code here and/or call the base class
HMODULE hDLL=GetModuleHandle(_T("MIVPToolbar.dll"));
HINSTANCE hEXE=AfxGetResourceHandle();
AfxSetResourceHandle((HINSTANCE)hDLL);
INT_PTR curp = CDialog::DoModal();
AfxSetResourceHandle(hEXE);
return curp;
}
其中MIVPToolbar.dll为导出类生成的动态链接库名字
这就解决了资源冲突问题。
2,动态创建
制作一个导出类的新的构造函数:
CMIVPToolDlg::CMIVPToolDlg(CWnd* pParent,UINT dType) // standard constructor
{
#ifndef _WIN32_WCE
EnableActiveAccessibility();
#endif
EnableAutomation();
HMODULE hDLL=GetModuleHandle(_T("MIVPToolbar.dll"));
HINSTANCE hEXE=AfxGetResourceHandle();
AfxSetResourceHandle((HINSTANCE)hDLL);
BOOL bCreated = CDialog::Create( IDD_FORMVIEW_TOOLDLG, pParent);
SUCCEEDED(bCreated);
AfxSetResourceHandle(hEXE);
}
在客户端动态创建方式非常简单,注意析构就可以了:
if( !m_toolbar1 )
{
m_toolbar1 = new CMIVPToolDlg(this,1);
}
m_toolbar1->ShowWindow(SW_SHOW);
3,通信
在扩展类中已经掌握了主类的指针,不成问题;同时,主类负责创建扩展类对象,拥有指针而且负责销毁对象。
4,宗旨
代码一样、思想更是一样。目的就是对面板进行封装,协作开发方便。比如,我要求某个哥们给我做个什么样的界面,提供的功能很单一,与其他模块的交互不多,那么就让他去起个exe工程,进行单独的编写和测试,然后我将他的工程通过这种方式做成dll库的方式供我主程序调用。
5, 讨论
这种方式的利弊还有待实践,有哥们说扩展MFC DLL仅适合做控件的扩展?
相关文章推荐
- 扩展 DLL资源冲突问题
- MFC解决程序退出时死锁和内存或资源泄露的问题
- MFC扩展DLL调用对话框,测试的时候报错问题的解决
- 关于VC6创建mfc程序提示缺少头文件或者缺少dll问题的解决
- Puppet扩展篇2-如何使用虚拟资源解决puppet冲突问题
- MFC扩展dll里导出函数时资源切换的问题
- 写DLL引起与主程序资源冲突的解决方法
- 解决DLL和主调程序的资源冲突及如何使用Dll的资源
- MFC扩展dll,在构造函数中加载资源,导致程序exe启动困难。
- 7.VC(custom)-解决DLL和主调程序的资源冲突及如何使用Dll的资源
- MFC扩展dll里导出函数时资源切换的问题
- jpcap 配置方法,问题解决,模拟sniffer程序。(附JAVA程序,jar,dll包等环境)
- 解决MFC程序[在静态库中使用 MFC]的问题
- 关于winXP和win7,vs2010,opencv2.3,运行程序,报错“计算机丢失tbb_debug.dll”问题解决办法
- 如何解决飞思卡尔芯片使用监控程序产生的冲突问题
- 多线程 DLL 回调函数问题,当应用程序退出时,有些操作并未完成,造成程序内存泄露,如何解决呢
- VC扩展mfc dll中子对话框不能获取焦点问题
- 无法启动此程序,因为计算机中丢失MSVCR100D.dll。尝试重新安装程序以解决此问题。
- 无法启动此程序,因为计算机中丢失AdbWinApi.dll。尝试重新安装该程序以解决此问题
- 无法启动此程序,因为计算机中丢失VCRUNTIME140.dll 尝试重新安装此程序以解决此问题