VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 313|回复: 0

VC++动态库编程-[4]MFC规则DLL讲解

[复制链接]
51_avatar_middle
online_admins Syc 发表于 2018-1-9 22:45:07 | 显示全部楼层 |阅读模式
1、MFC规则DLL特点:
●DLL内部可以使用MFC类库;
●可以被其他所有支持DLL技术的语言所调用。

2、MFC规则DLL的入口点函数:
默认情况下DLL的入口点函数都是DllMain,MFC规则DLL也不例外,但是因为是支持MFC的,所以在MFC规则DLL中,DllMain函数已经被MFC所封装,所以在你的工程中是看不到DllMain函数的,就好像在MFC对话框工程中你找不到WinMain函数一样的,不过也有一些补救的技巧,就是InitInstance()与ExitInstance()函数,当进程初始化调用DLL时,DLL中会默认调用那个InitInstance()函数,当EXE退出时DLL会调用ExitInstance()函数,但是当有新线程时,处于程序安全性考虑则没有什么好的办法进行处理。

3、MFC规则DLL分为两类:
●静态链接到MFC的规则DLL:与MFC库静态链接,会将MFC类库的代码直接编译生成到DLL文件中,在调用这种DLL的接口时,MFC使用DLL的资源,因此,不需要模块状态的切换,但是缺点就是使用这种方式生成的DLL文件大小比较大。

●动态链接到MFC的规则DLL:可以和调用DLL的EXE同时动态链接到MFC库,在这种情况下,MFC使用主应用程序(即:EXE程序)的资源句柄来加载资源模版,这样,当DLL和应用程序中存在相同ID的资源时,就要进行模块的切换,以便MFC能够找到正确的资源模版。

4、MFC规则DLL的模块状态切换:
三种方法:
①、
  1. AFX_MANAGE_STATE(AfxGetStaticModuleState());
复制代码


②、
  1. HINSTANCE hSaveInst = AfxGetResourceHandle();
  2. AfxSetResourceHandle(theApp.m_hInstance);
  3. ... ... //执行语句;
  4. AfxSetResourceHandle(hSaveInst);
复制代码


③、
  1. HINSTANCE hExeInst = GetModuleHandle(NULL);
  2. HINSTANCE hDLLInst = GetModuleHandle(_T("MFCDLL.dll"));
  3. ASSERT(hExeInst && hDLLInst);
  4. AfxSetResourceHandle(hDLLInst);
  5. ... ... //执行语句;
  6. AfxSetResourceHandle(hExeInst);
复制代码


★最方便的还是第一种方法,前两种是在DLL导出函数中进行添加,第三种是在EXE程序中进行添加。

本套教程由VC驿站原创,完全免费!
相关课程演示细节还请观看视频教程!
教程下载地址:https://www.cctry.com/thread-7-1-1.html




上一篇:VC++动态库编程-[3]DLL导出函数的调用
下一篇:VC++动态库编程-[5]进程注入技术讲解

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-12-11 02:48

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表