青岛药店: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++项目都是这样子的;
                第一次写技术博客,写的不好,大家多扔砖头; 转载请表明出处