青岛药店:MFC资源DLL简单实现
来源:百度文库 编辑:九乡新闻网 时间:2024/10/06 00:03:10
日志
辨柳如果你正承受不辛,请你告诉我,如果你正享受幸福,请你离开我, 加博友 关注他 他的网易微博
最新日志
- 人来人往
- 这一天
- 个人愚见: 汪峰与旭日阳刚
- 十二月泪
- what i want
- 纪念下
该作者的其他文章
博主推荐
相关日志
随机阅读
首页推荐
- 李银河:同性恋与乱伦
- 智利泡温泉围观走光(图)
- 热血知青不该被时代遗忘
- 不能自理的中国留学生
- 泰拳比赛血水四溅(图)
- 慈善成了官员的敛财工具
对“推广广告”提建议
从开始到现在 最孤独的人(二)
MFC资源DLL简单实现
2008-06-22 21:15:33| 分类: VC | 标签: |字号大中小 订阅
最近的项目中用到这个东西,周末自己研究了一下,虽然网上有相关的资料,但是对初学者还是有点隐晦,不是很明白;避免大家像我一样走弯路,小小总结一下:一般的程序 exe文件中都包含了资源, 举例: 如飞鸽传说就只有一个exe文件; 1,所以 exe 中是包含有资源的!
而我们理解的 Dll有什么什么呢? 2, Dll其实是令一种"exe"了,简单的可以这么理解,所以,我们的目的就是把Exe中这部分要加载资源的任务 扔给另一个Dll兄弟去做;好了, 目的明白了,现在开始动手!
1, 很简单,先建立一个MFC 程序,简单起见 Base Dialog的 Main (工程名);
2, 删除该工程中的 resource.h main.rc(资源文件);注意,是在VC 工程见面中删除,并没有在硬盘资源管理器上删除,(注意:VC2005删除的时候会提示要 Remove 还是 Delete,当然是Remove了);
3, 建立一个Mfc扩展Dll工程,工程名 english;
4, 这一步最重要, 我们的目的是要把Exe的资源转嫁到Dll中,最后用Exe去调用Dll, 所以,把Dll工程中的resource.h 文件干掉(删除点,并切在硬盘上也删除点); 把exe工程中的resource.h文件和main.rc文件,Res文件夹中的文件统统Copy到Dll工程对应的位置,并且添加到工程当中; 此时不用多说,大家都明白为何了吧?
5, 编译Dll工程,得到Dll文件;
6, 在Exe工程的App文件中, A) main.h文件中,注释点原来的Resource.h ; 改成我们的Dll工程的 resource.h(注意路径) 添加变量 HINSTANCE m_hResourceDll; B) 在。cpp文件中的InitInstance()中最前面(注意是最前面)添加
m_hResourceDll = AfxLoadLibrary(_T("english.dll"));
if( m_hResourceDll )
{
AfxSetResourceHandle(m_hResourceDll);
}
else
{
return FALSE;
}
在ExitInstance()中 添加:
AfxFreeLibrary(m_hResourceDll); (干完活了,当然要人家休息了不是?)
至于为什么要加, 跟我一起跟入MFC源码查看究竟:
我们知道, 在Exe工程中,显示我们主Dialog的代码为
CMainDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
注意这个DoModal函数,F12, 再“go”,
LPCDLGTEMPLATE lpDialogTemplate = m_lpDialogTemplate;
HGLOBAL hDialogTemplate = m_hDialogTemplate;
HINSTANCE hInst = AfxGetResourceHandle();
if (m_lpszTemplateName != NULL)
{
hInst = AfxFindResourceHandle(m_lpszTemplateName, RT_DIALOG);
HRSRC hResource = ::FindResource(hInst, m_lpszTemplateName, RT_DIALOG);
hDialogTemplate = LoadResource(hInst, hResource);
}
这其中最关键的函数: AfxGetResourceHandle();又是做什么呢?
_AFXWIN_INLINE HINSTANCE AFXAPI AfxGetResourceHandle()
{ ASSERT(afxCurrentResourceHandle != NULL);
原来只是取得一个ResourceHandle而已,所有资源的活水源在这里开始; 既然有Get 肯定有 Set; 所以:
如果我们不想要默认的ResourceHandle,想要我们自己做的资源,就要Set一下喽(在它调用默认的资源前,先偷梁换柱,换成我们的), 这也就是为什么用AfxSetResourceHandle 函数的原因,也是为什么把我们的代码放在InitInstance()最前面的原因,准确的说是在Domal()前面的原因;不知道我解释清楚没有,呵呵;
7, 好了,编译,运行; 是不是可以了?
总结: 很简单,不是吗? 就是把资源任务抽出来,给别人干,别人干完的陈果(Dll文件),我们拿来一用而已;理解这个概念就明白为什么我们要Delete这个,Add那个了;
题外话: 在软件工程中,很多项目要做成这样,因为资源是资源,逻辑是逻辑,我们为了更好的低耦合, 也为了更好地编写” 多语言“版本的软件; 做成这样是很有必要的;起码我接触过的C++项目都是这样子的;
第一次写技术博客,写的不好,大家多扔砖头; 转载请表明出处
MFC资源DLL简单实现
MFC的DLL
MFC 没有找到MFC80D.DLL的解决方法
快速实现MFC类浏览器
在DLL中使用资源
用MFC+com+html实现GUI
MFC双缓冲实现闪烁的处理
使用MFC快速实现网络编程 CAsyncSocket
(转)在DLL中使用资源(CDialog)
Shell32.Dll 图标资源对照表
在DLL中使用资源(一)
DLL
VS2008平台下,MFC操作EXCEL简单示例b
VS2008平台下,MFC操作EXCEL简单示例htrdh
上海创兴资源:立足资源开发 实现二次腾飞
S60 3rd资源本地化的实现
VS2005 纯资源DLL编写与使用【手把手系列】 - 名刀 - 秋水 - CSDN博客
用DLL实现把数据库的记录导出到EXCEL中(VB)转
用DLL实现把数据库的记录导出到EXCEL中(VB) - 应用程序 - VB教程
教你怎样在shell32.dll里换图标,及图标所在文件名(页 1) - 『深度美化资源区...
MFC是什么意思?
工具栏 Without MFC(非MFC)
李克强:两个市场两种资源实现互利共赢
以公房资源求发展 实现人性化管理