封装dll遇到的奇葩错误:error LNK2005: _DllMain@12 已经在 DLLMain.obj 中定义

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

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

  

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

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

#include <windows.h>

#ifdef _X86_
extern "C" { int _afxForceUSRDLL; } #else extern "C" { int __afxForceUSRDLL; } #endif BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) { switch( ul_reason_for_call ) { case DLL_PROCESS_ATTACH:break; case DLL_THREAD_ATTACH:break; case DLL_PROCESS_DETACH:break; case DLL_THREAD_DETACH:break; } return TRUE; }


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

#ifdef _X86_
extern "C" { int _afxForceUSRDLL; }
#else
extern "C" { int __afxForceUSRDLL; }
#endif

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

 

 

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

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

假设类:class CFetchHttp

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

#ifndef EXPORT_CLASS_EXPORTS
#define EXPORT_CLASS __declspec(dllexport)
#else
#define EXPORT_CLASS __declspec(dllimport)
#endif

class EXPORT_CLASS CFetchHttp
{
        //在这里定义方法    
}

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

输出:CFetchHttp.dll和CFetchHttp.lib


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

 

转载于:https://www.cnblogs.com/foundwant/p/3410077.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值