15,471
社区成员
发帖
与我相关
我的任务
分享
#ifndef FOUROPERATIONS_H_
#define FOUROPERATIONS_H_
#ifdef MYCLASSDLL
#define MYCLASSDLL _declspec(dllimport)
#else
#define MYCLASSDLL _declspec(dllexport)
#endif
namespace MathFuncs
{
class MYCLASSDLL MyMathFuncs
{
public:
// Returns a+b
double Add(double a, double b);
// Returns a-b
double Subtract(double a, double b);
// Returns a*b
double Multiply(double a, double b);
// Returns a/b
double Divide(double a, double b);
};
}
#endif
#include "stdafx.h"
#include "FourOperations.h"
#include <iostream>
#include <stdexcept>
using namespace std;
namespace MathFuncs
{
double MyMathFuncs::Add(double a, double b)
{
return a+b;
}
double MyMathFuncs::Subtract(double a, double b)
{
return a-b;
}
double MyMathFuncs::Multiply(double a, double b)
{
return a*b;
}
double MyMathFuncs::Divide(double a, double b)
{
if (b==0)
{
throw new invalid_argument("b cannot be zero!");
}
return a/b;
}
}
LIBRARY "MyClassDll"
EXPORTS
Add @1
Subtract @2
Multiply @3
Divide @4
#include "stdafx.h"
#include <Windows.h>
#include <string>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
HMODULE hdll;//HMODULE是模块句柄,HINSTANCE表示实例句柄
hdll=LoadLibrary(_T("MyClassDll.dll"));//_T使默认字符集“unicode”有效
//取的地址要判断,返回的句柄是否为空,若空,则释放加载DLL所占用的内存
if(hdll==NULL)
{
FreeLibrary(hdll);
}
typedef int(*AddAddr)(int x,int y);//定义函数指针类型(与DLL定义参数一致)
AddAddr Add =(AddAddr)GetProcAddress(hdll,"Add");//先是定一个函数指针AddAddr Add;然后通过GetProcAdress(DLL句柄,调用函数名)来获取函数的地址
if(Add==NULL)
{
FreeLibrary(hdll);
}//取的地址要判断,返回的句柄是否为空,若空,则释放句柄
int x = Add(1,2);
cout<< x << endl;
FreeLibrary(hdll);
return 0;
}