我们知道提高开发效率的一个很重要的途径就是代码复用,我们经常将一些常用的功能构造成相对独立的模块,并在之后的项目重复使用,代码复用的方式有两种:
如图:
然后新建mymath.h和mymath.cpp文件。
mymath.h如下:
#pragma once
#ifdef MATH_EXPORTS
#define MATH_API __declspec(dllexport)
#else
#define MATH_API __declspec(dllimport)
#endif
namespace shun
{
class MATH_API Cmath { //类
public:
int add(int a,int b);
};
extern "C" MATH_API float pi; //变量
extern "C" MATH_API int getMax(int &,int &); //函数
}#include "stdafx.h"
#include "mymath.h"
namespace shun
{
float pi=3.1415; //变量
int getMax(int& a, int& b) //函数
{
return a > b ? a : b;
}
int Cmath::add(int a,int b) //类方法
{
return a + b;
}
}然后添加一个test.cpp文件,输入如下:
#include <iostream>
#include "mymath.h"
using namespace std;
int main(char argc, char**argv)
{
int a = 1, b = 2;
//类的使用
shun::Cmath cm;
cout<<cm.add(1,2)<<endl;
//变量
cout<<shun::pi<<endl;
//函数
cout<<shun::getMax(a,b);
getchar();
return 0;
} 运行一下我们发现调用dll项目了有木有。。#include <iostream>
#include "mymath.h"
using namespace std;
int main(char argc, char**argv)
{
int a = 1, b = 2;
//类的使用
shun::Cmath cm;
cout<<cm.add(1,2)<<endl;
//变量
cout<<shun::pi<<endl;
//函数
cout<<shun::getMax(a,b);
getchar();
return 0;
} 因为需要使用到windows api,所以要引入windows.h头文件。
添加test.cpp如下:
#include <windows.h>
#include <iostream>
using namespace std;
typedef int (*Func)(int &, int &);
int main(int argc, char *argv[])
{
int a = 5, b = 10;
HMODULE hDll = LoadLibrary("math.dll");
if (hDll != NULL)
{
Func getMax = (Func)GetProcAddress(hDll, "getMax"); //函数
if (getMax != NULL)
{
cout<<getMax(a, b)<<endl;
}
float* pPi = (float*)GetProcAddress(hDll,"pi"); //变量
if(pPi != NULL)
{
cout<<*pPi<<endl;
}
FreeLibrary(hDll);
}
getchar();
}
如果对于函数指针不太熟悉的话可以点这里:函数指针总结
//.h文件
extern "C" MATH_API int add_Interface(int &,int &); //函数
//.cpp文件
int add_Interface(int &a,int &b)
{
Cmath cm;
return cm.add(a,b);
}
我们知道,extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。
C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称。void foo( int x, int y );该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同)。
原文地址:http://blog.csdn.net/shun_fzll/article/details/39078971