打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
MFC资源DLL简单实现
 
 
 
 
 

日志

 
 

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++项目都是这样子的;
      第一次写技术博客,写的不好,大家多扔砖头; 转载请表明出处
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
在DLL中使用资源(二)
基于vc的程序加载多个资源文件的方式
在C#中调用VC编写的dll库
MFC 没有找到MFC80D.DLL的解决方法
MT4编程
VC生成EXE文件
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服