一、制作动态链接库:导出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做动态链接库接口,会不通用的。