制作动态链接库需要注意的

一、制作动态链接库:导出dll时,如果是对类的到处,需要注意的是:
1.导出宏不能带extern "C",因为c的方式中没有类的概念
2.导出宏放在class和类名之间,不能放到class前面。--而单独导出一个函数时(不含类的),导出宏需要放在返回类型前面。

#ifdef MMAIL_DLL_EXPORTS
//#define MDLLEXPORT extern "C" __declspec(dllexport)
#define MDLLEXPORT __declspec(dllexport)
#else
#define MDLLEXPORT __declspec(dllimport)
#endif

class MDLLEXPORT MMail               //对于导出类时,导出宏必须位于class和类名之间,且导出宏不能包含extern "C"
{
public:
 MMail(void);
 ~MMail(void);

 int sendmail(char* errorInfo,char** attachFiles,int fileCounts);
};

 

导出一个函数时(不含类的),导出宏需要放在返回类型前面:

error:
int MDLLEXPORT sendmail(char* errorInfo,char** attachFiles,int fileCounts);

ok:
MDLLEXPORT int  sendmail(char* errorInfo,char** attachFiles,int fileCounts);

二、调用动态链接看的两种方式:动态加载和静态加载

#include "MMail.h"

//动态方法调用
typedef int (*pFUNC)(char* errorInfo,char** attachFiles,int fileCounts);
   HMODULE hModule=NULL;
   pFUNC pSendMail;
#ifdef _DEBUG
   hModule = LoadLibrary("MMaild.dll");//如果dll的路径不对,这种形式在编译的时候并不会报错,只有在真正调用的时候才会报错!
#else
   hModule = LoadLibrary("MMail.dll");
#endif
   pSendMail = (pFUNC)GetProcAddress(hModule,"sendmail");
   if(pSendMail)
   {
    //int res=sendmail(errInfo,attachFiles,1);
    int res=pSendMail(errInfo,attachFiles,1);
    if(0 == res)
    {
     AfxMessageBox(_T("Send dmp File Successfully!"));
    }
    else
    {
     AfxMessageBox(_T("Send dmp File Failed!"));
    }
   }
   
   
//静态方法调用   
int res=sendmail(errInfo,attachFiles,1);//如果lib指向的dll路径不对,这种形式在编译的时候就会报错!

 三、如果参数是字符串类型,通常写成char*或char**类型

动态链接库接口写成char*类型的比价通用,vs2010编写的也可以备vs2005等低版本的调用。
但是不要用stl类型如string做动态链接库接口,会不通用的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值