VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 443|回复: 2

C++ DLL和和MFCDLL的入口不一样?

[复制链接]
35_avatar_middle
最佳答案
0 
online_vip 发表于 2019-8-26 18:20:42 | 显示全部楼层 |阅读模式
MFC把C++DLL封装了起来,那么这2个DLL的启动函数入口是不是不一样?
我只知道C++DLL的入口是dllmain,那么MFCDLL入口不是dllmain吗?




上一篇:VC驿站第五课出现错误
下一篇:借鉴Syc老师的一段代码时,出错
58_avatar_middle
最佳答案
43 
online_vip 发表于 2019-8-27 08:21:32 | 显示全部楼层
以下是MFC源码截取,出于成本、兼容性、可重用性、推广....,MFC是不可能重复造轮子的!

  1. DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
  2. {
  3.         // 如果使用 lpReserved,请将此移除
  4.         UNREFERENCED_PARAMETER(lpReserved);

  5.         if (dwReason == DLL_PROCESS_ATTACH)
  6.         {
  7.                 TRACE0("MyDll.DLL 正在初始化!\n");
  8.                
  9.                 // 扩展 DLL 一次性初始化
  10.                 if (!AfxInitExtensionModule(ddsDLL, hInstance))
  11.                         return 0;

  12.                 // 将此 DLL 插入到资源链中
  13.                 // 注意: 如果此扩展 DLL 由
  14.                 //  MFC 规则 DLL (如 ActiveX 控件)隐式链接到,
  15.                 //  而不是由 MFC 应用程序链接到,则需要
  16.                 //  将此行从 DllMain 中移除并将其放置在一个
  17.                 //  从此扩展 DLL 导出的单独的函数中。使用此扩展 DLL 的
  18.                 //  规则 DLL 然后应显式
  19.                 //  调用该函数以初始化此扩展 DLL。否则,
  20.                 //  CDynLinkLibrary 对象不会附加到
  21.                 //  规则 DLL 的资源链,并将导致严重的
  22.                 //  问题。

  23.                 new CDynLinkLibrary(ddsDLL);

  24.         }
  25.         else if (dwReason == DLL_PROCESS_DETACH)
  26.         {
  27.                 TRACE0("dds.DLL 正在终止!\n");

  28.                 // 在调用析构函数之前终止该库
  29.                 AfxTermExtensionModule(ddsDLL);
  30.         }
  31.         return 1;   // 确定
  32. }
复制代码
  1. BOOL WINAPI ExtRawDllMain(HINSTANCE, DWORD dwReason, LPVOID)
  2. {
  3.         if (dwReason == DLL_PROCESS_ATTACH)
  4.         {
  5.                 // save critical data pointers before running the constructors
  6.                 AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
  7.                 pModuleState->m_pClassInit = pModuleState->m_classList;
  8.                 pModuleState->m_pFactoryInit = pModuleState->m_factoryList;
  9.                 pModuleState->m_classList.m_pHead = NULL;
  10.                 pModuleState->m_factoryList.m_pHead = NULL;
  11.         }
  12.         return TRUE;    // ok
  13. }
复制代码
81_avatar_middle
最佳答案
3 
online_supermod 发表于 2019-8-27 09:05:36 | 显示全部楼层
这就好比默认 Windows 程序的入口点函数都是 WinMain 一样,SDK API 的程序默认入口点就是 WinMain,但是 MFC 的程序默认入口点也是 WinMain,只不过封装了一下,入口点变成了 CWinApp::InitInstance 了。DLL也是一样的道理
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

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

GMT+8, 2020-10-21 09:05

Powered by CcTry.CoM

© 2009-2020 cctry.com

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