VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

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

[原创] Win32-DLL添加MFC支持及DllMain冲突的解决办法

[复制链接]
51_avatar_middle
online_admins Syc 发表于 2017-7-20 16:29:29 | 显示全部楼层 |阅读模式
今天遇到了一个项目,原来的工程类型是EXE的,MFC类型的,现在想改成DLL的,因为想在DLL被进程加载的时候进行一些初始化的过程,于是就要创建一个线程,大家都知道在MFC规则DLL的 InitInstance 初始化函数中进行线程的创建会卡死的,于是只能使用Win32类型的DLL,在其入口函数 DllMain 的 DLL_PROCESS_ATTACH 条件下,进行 CreateThread 线程的创建。另外,因为以前的工程类型是MFC,代码里面很多东西都用到了MFC,所以在新建的Win32类型的DLL工程中要添加上MFC的支持。

想好了就开始做,新建了一个Win32类型的DLL工程,默认不勾选MFC支持,如下图:
Win32-DLL添加MFC支持及DllMain冲突的解决办法

创建完成后,会默认生成一个 dllmain.cpp 的文件,里面包含了DLL的入口函数 DllMain 的相关定义,如下:
  1. BOOL APIENTRY DllMain( HMODULE hModule,
  2.                        DWORD  ul_reason_for_call,
  3.                        LPVOID lpReserved
  4.                                          )
  5. {
  6.         switch (ul_reason_for_call)
  7.         {
  8.         case DLL_PROCESS_ATTACH:
  9.         case DLL_THREAD_ATTACH:
  10.         case DLL_THREAD_DETACH:
  11.         case DLL_PROCESS_DETACH:
  12.                 break;
  13.         }
  14.         return TRUE;
  15. }
复制代码


好,接下来,给咱们的Win32-DLL工程添加MFC的支持:

Alt+F7 调出工程属性对话框,按照下图修改,Debug和Release都要修改啊:

Win32-DLL添加MFC支持及DllMain冲突的解决办法

Win32-DLL添加MFC支持及DllMain冲突的解决办法

备注:Debug版的运行时库选择:多线程调试 (/MTd),Release版的运行时库选择:多线程 (/MT),别弄错了。

之后,打开工程的 stdafx.h 文件,添加常用MFC的头文件支持,去掉 windows.h 的包含,修改后的 stdafx.h 代码如下:

  1. #pragma once

  2. #include "targetver.h"

  3. #define WIN32_LEAN_AND_MEAN             //  从 Windows 头文件中排除极少使用的信息


  4. // TODO:  在此处引用程序需要的其他头文件
  5. #ifndef VC_EXTRALEAN
  6. #define VC_EXTRALEAN            // 从 Windows 头中排除极少使用的资料
  7. #endif

  8. #include "targetver.h"

  9. #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // 某些 CString 构造函数将是显式的

  10. #include <afxwin.h>         // MFC 核心组件和标准组件
  11. #include <afxext.h>         // MFC 扩展

  12. #ifndef _AFX_NO_OLE_SUPPORT
  13. #include <afxole.h>         // MFC OLE 类
  14. #include <afxodlgs.h>       // MFC OLE 对话框类
  15. #include <afxdisp.h>        // MFC 自动化类
  16. #endif // _AFX_NO_OLE_SUPPORT

  17. #ifndef _AFX_NO_DB_SUPPORT
  18. #include <afxdb.h>                      // MFC ODBC 数据库类
  19. #endif // _AFX_NO_DB_SUPPORT

  20. #ifndef _AFX_NO_DAO_SUPPORT
  21. #include <afxdao.h>                     // MFC DAO 数据库类
  22. #endif // _AFX_NO_DAO_SUPPORT

  23. #ifndef _AFX_NO_OLE_SUPPORT
  24. #include <afxdtctl.h>           // MFC 对 Internet Explorer 4 公共控件的支持
  25. #endif
  26. #ifndef _AFX_NO_AFXCMN_SUPPORT
  27. #include <afxcmn.h>                     // MFC 对 Windows 公共控件的支持
  28. #endif // _AFX_NO_AFXCMN_SUPPORT
复制代码


原本以为做完以上这些工作就差不多了,F7开始编译,结果提示我一个链接错误:
  1. uafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12 已经在 dllmain.obj 中定义
复制代码


从网上找了找资料,有两种解决办法:

办法一:
在 dllmain.cpp 文件中的 DllMain 上面加入如下代码:

  1. #ifdef _X86_
  2. extern "C" { int _afxForceUSRDLL; }
  3. #else
  4. extern "C" { int __afxForceUSRDLL; }
  5. #endif
复制代码


作用就是不使用MFC的入口点函数,强制使用我们自己定义的DllMain入口点函数。

办法二:
Alt+F7 打开项目属性对话框,C/C++ ->预处理器->预处理器定义中,去掉 _USRDLL 项即可,如下图:
Win32-DLL添加MFC支持及DllMain冲突的解决办法

好了,大家自己都试试吧,打完收工!

附工程源码:编译环境VS2013:
Win32-DLL添加MFC支持及DllMain冲突的解决办法 DLLTest.zip (8.5 KB, 下载次数: 2)




上一篇:写一个不大于30行代码的程序
下一篇:VC++中物理设备

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

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

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

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

本版积分规则

关闭

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

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

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

GMT+8, 2018-11-16 12:21

Powered by Discuz! X3.4

© 2009-2018 cctry.com

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