在定义一个dll工程的时候,一添加MFC的头文件就会报出这个 错误:error LNK2005: _DllMain@12 已经在 DLLMain.obj 中定义  既蛋疼又蛋疼!!

然后逛论坛,查资料,妹的,都尼玛是去论坛看热闹的,没有一个起的上作用的!无奈之,遂请教。。。于是乎,解决!

  

  在创建Dll工程的时候,需要我们定义一个DllMain的入口函数,问题就出在这里! 当我们添加MFC的头文字时候,MFC默认封装了这个入口函数,你也不知道是哪个头文件里面封装的,但是我包含了这些头文件:<afx.h>  <afxinet.h> 就加了这两个头文件就出了问题!

于是只能在自己定义的DllMain.cpp入口函数上做处理,下面是解决之后的内容:

  1. #include <windows.h>

  2. #ifdef _X86_
  3. extern "C" { int _afxForceUSRDLL; }
  4. #else
  5. extern "C" { int __afxForceUSRDLL; }
  6. #endif
  7.  
  8. BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
  9. {
  10. switch( ul_reason_for_call )
  11. {
  12. case DLL_PROCESS_ATTACH:break;
  13. case DLL_THREAD_ATTACH:break;
  14. case DLL_PROCESS_DETACH:break;
  15. case DLL_THREAD_DETACH:break;
  16. }
  17. return TRUE;
  18. }

其中最关键的就是下面这些内容:

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

它的作用就是强制使用你自己定义的DllMain入口函数,因为MFC封装的很扯淡,总是强奸用户!

第二部分:DLL封装C++类

1.首先是针对一个类,将这个类作为接口对外公开

假设类:class CFetchHttp

那么建立dll工程,新建头文件:CFetchHttp.h

  1. #ifndef EXPORT_CLASS_EXPORTS
  2. #define EXPORT_CLASS __declspec(dllexport)
  3. #else
  4. #define EXPORT_CLASS __declspec(dllimport)
  5. #endif
  6.  
  7. class EXPORT_CLASS CFetchHttp
  8. {
  9. //在这里定义方法
  10. }

然后新建源文件:CFetchHttp.cpp 把类中的方法实现。

输出:CFetchHttp.dll和CFetchHttp.lib

使用时:在你的项目对应的文件中加入
#include "CFetchHttp.h"   
同时把CFetchHttp.h所在目录添加到项目的include 目录,把CFetchHttp.dll和CFetchHttp.lib拷贝到新程序目录下,把CFetchHttp.lib所在目录添加到附加库目录。

 

參考

https://www.bbsmax.com/A/kmzLL4yEzG/